为什么retainCount返回2

时间:2013-02-16 16:40:16

标签: ios objective-c cocoa-touch memory-management memory-leaks

我有财产:

@property(nonatomic, retain) NSMutableArray *myvar;

第一种情况:

    myvar = [[NSMutableArray alloc] init];
    NSLog(@retainCount: %i:", [myvar  retainCount]);

输出:

  

retainCount:1

第二种情况:

    self.myvar = [[NSMutableArray alloc] init];
    NSLog(@retainCount: %i:", [self.myvar  retainCount]);

输出:

  

retainCount:2

我的问题是:为什么在第二种情况下保留值是2?

4 个答案:

答案 0 :(得分:8)

唯一有效的答案:永远不要检查,使用,信任retainCount。它不用于调试或直接用于内存管理。

有用:whentouseretaincount.com

但在你的情况下:因为你没有使用ARC(否则编译不允许你使用retainCount)你过度保留。

它保留在@property(nonatomic, retain) NSMutableArray *myvar;

和此处:self.myvar = [[NSMutableArray alloc] init];

做的:

self.myvar = [[[NSMutableArray alloc] init] autorelease]; //will release once soon

我最喜欢的,独立于ARC / MRC和短

self.myvar = [NSMutableArray array]; // identical to the first example

或更明确的

NSMutableArray *var = [[NSMutableArray alloc] init]; 
self.myvar = var; 
[var release];

答案 1 :(得分:4)

+1,因为你alloc/init'它 +1,因为self.myvar会保留它(如您的财产声明中所述)

如果您在alloc / init之后autorelease,它将返回到1 ...然后如果您将self.myvar设置为nil,它将达到0(如果没有其他任何内容保留在其间)

但正如vikingosegundo所说,你不想搞乱保留计数。操作系统确定何时将它们击倒,因此您不能将它们用作可靠的状态测量。

答案 2 :(得分:1)

这是我在ARC出现之前经常使用的规则:

'NARC规则':

如果您使用NewAllocRetainCopy,请将计数加1。

在第二种情况下,您的保留计数为2,因为您在类的实例属性上使用allocretain(使用self关键字)。在另一种情况下,您没有使用合成的setter来设置变量,因此不使用retain。探索实际做什么属性以增进理解。

vikingosegundo在他的回答中解释了正确的做事方式。

希望有所帮助!

答案 3 :(得分:0)

请参阅此答案:Question About Retain Counts & initializing member variables

  

首先,为init分配一个新的NSArray对象。这是保留计数   1.其次,在将对象分配给实例var时,setter会向对象发送保留消息。这使得保留计数最多   2。

干杯。