我对retainCount有个问题
NSLog(@"%i", [self.albumReceiver retainCount]);
self.albumReceiver = [[[FacebookAlbumsDelegateReceiver alloc] init: self] autorelease];
NSLog(@"%i", [self.albumReceiver retainCount]);第一行的保留计数是0,但当它到达第三行时是3。self.albumReceiver上的属性是保留属性...但据我所知,它应该是2,而其他以后的保留计数应该是1,因为它是稍后自动释放的。
NSLog(@"%i", [self.albumReceiver retainCount]);
albumReceiver = [[[FacebookAlbumsDelegateReceiver alloc] init: self];
NSLog(@"%i", [self.albumReceiver retainCount]);保留计数从0开始,在这种情况下,第二个保留计数打印2...
有没有人能介绍一下这种保留和释放的工作原理……
我想如果没有'self‘关键字,它会忽略setter调用,是吗?但是如果我把自动释放放在第二个例子中,我就会出错。
发布于 2012-05-31 17:36:30
首先,保留计数是一个实现细节,您不应该过于关注它。你真的应该只关心所有权。
话虽如此,对你所看到的东西的解释如下:
第一行的保留计数为0
这是因为在这一点上self.albumReceiver是nil。在真实对象上,您永远不会看到保留计数为0(在当前的Foundation实现中)。
到达第三行时的
为3
通常情况下,保留计数应为2,分配的保留计数为+1,分配给保留属性的保留计数为+1。但是,init:方法可能会导致其他对象保留它,该属性的设置器也是如此。观察该属性的另一个对象可能也会选择保留该对象。简而言之,除非您知道所有涉及的方法的确切实现,并且您确定没有在albumReceiver上使用KVO,否则关于保留计数,您所能说的就是self拥有它的所有权(NB所有权不是独占的,其他东西也可能拥有所有权)。这就是为什么你不应该在保留计数上花太多的精力。
有人能介绍一下这种保留和释放的工作原理吗?
是。你需要从所有权的角度来考虑。某些方法会给你一个你拥有的对象。这些方法是以alloc开头的任何方法、以new开头的任何方法、以copy或mutableCopy开头的任何方法以及-retain。如果您以任何其他方式接收对象,则您并不拥有它。这包括接收它们作为方法的返回结果、方法的ass参数或通过方法的引用参数或作为全局或静态变量。
如果你拥有一个对象,你必须通过释放或自动释放它来放弃所有权,否则它会泄漏。如果您不拥有某个对象,则不能释放或自动释放它。
我发现最好将上面的"you“理解为”声明对象引用的作用域“。
无论如何,我建议你阅读苹果的Memory Management Rules来获得明确的解释,不要相信这里的答案。如果你看一下这个答案的原始编辑,你会发现我把规则稍微弄错了,因为自从我上次阅读它们以来,它们已经被收紧了。
发布于 2012-05-31 17:16:10
请勿使用retainCount。(对于适合使用它的情况,请参阅see this website。)进一步阅读:blog post by bbum,previous SO thread one,thread two。另请注意,retainCount在最近的SDK中已弃用。注意弃用警告是个好主意,把所有警告都变成错误是更好的主意。
发布于 2012-05-31 17:22:23
在Objective-C中关注对象的retainCount通常不是一个好主意,因为通常不可能知道框架的哪些秘密部分需要保留该对象。
在你提到的将对象添加到自动释放池中的情况下,自动释放池可能会保留该对象,直到刷新该池为止(在运行循环期间)。此可能解释了为什么autoreleased对象的保留计数更高。
注意上面段落中“大概”和“可能”的用法。我不知道这是否是Cocoa/Cocoa Touch框架中正在发生的事情。这就是使用retainCount的问题所在,您无法随时知道保留计数应该是多少。
如果对对象执行retain操作(或者使用包含alloc、copy、mutableCopy或new的方法名创建对象),则可以对其执行release操作。框架也可以自由地retain对象,当它们准备好的时候,它们将release它。当保留计数达到零时,它将被dealloc。
更新:看过NSObject和NSAutoreleasePool的GNUStep源代码后,我上面可能的解释可能不是正在发生的事情。但是,我无法确定,因为我看不到Apple对这两个对象的实现。甚至有更多的理由不相信retainCount或它的任何推论。
https://stackoverflow.com/questions/10830549
复制相似问题