我有财产:
@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?
答案 0 :(得分:8)
唯一有效的答案:永远不要检查,使用,信任retainCount。它不用于调试或直接用于内存管理。
但在你的情况下:因为你没有使用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规则':
如果您使用New
,Alloc
,Retain
或Copy
,请将计数加1。
在第二种情况下,您的保留计数为2,因为您在类的实例属性上使用alloc
和retain
(使用self
关键字)。在另一种情况下,您没有使用合成的setter来设置变量,因此不使用retain
。探索实际做什么属性以增进理解。
vikingosegundo在他的回答中解释了正确的做事方式。
希望有所帮助!
答案 3 :(得分:0)
请参阅此答案:Question About Retain Counts & initializing member variables
首先,为init分配一个新的NSArray对象。这是保留计数 1.其次,在将对象分配给实例var时,setter会向对象发送保留消息。这使得保留计数最多 2。
干杯。