1

我有财产:

@property(nonatomic, retain) NSMutableArray *myvar;

第一种情况:

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

输出:

保留计数:1

第二种情况:

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

输出:

保留计数:2

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

4

4 回答 4

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];
于 2013-02-16T16:42:43.843 回答
4

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

如果你autorelease在 alloc/init 之后,它会回到 1...然后如果你设置self.myvar为 nil,它会达到 0(如果在此期间没有其他东西保留它)

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

于 2013-02-16T16:47:54.130 回答
1

这是我在 ARC 出现之前曾经遵循的规则:

“NARC 规则”:

如果您使用New、或Alloc,则将计数加一。RetainCopy

在第二种情况下,您的保留计数为 2,因为您在类的实例属性上使用allocretain(通过使用self关键字)。在另一种情况下,您没有使用综合设置器来设置变量,因此不使用retain. 探索哪些属性实际上可以增加理解。

vikingosegundo 在他的回答中很好地解释了做事的正确方法。

希望有帮助!

于 2013-02-16T17:31:04.653 回答
0

请参阅此答案:关于保留计数和初始化成员变量的问题

首先,你分配初始化一个新的 NSArray 对象。这是 1 的保留计数。其次,您的 setter 在将对象分配给您的实例 var 时会向该对象发送一条保留消息。这会将保留计数增加到 2。

干杯。

于 2013-02-16T16:44:59.070 回答