【问题标题】:Why retainCount returns 2 [duplicate]为什么retainCount返回2 [重复]
【发布时间】:2013-02-01 11:35:10
【问题描述】:

我有财产:

@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 ?

【问题讨论】:

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


【解决方案1】:

唯一有效的答案:从不检查、使用、信任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];

【讨论】:

  • @H2CO3,你是对的。
  • 我总是使用方便的方法。
  • 是的,这些更适合这个:)
【解决方案2】:

看到这个答案:Question About Retain Counts & initializing member variables

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

干杯。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我没有注意到 self.myvar 与 myvar 完全不同。谢谢!
    【解决方案4】:

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

    'NARC 规则':

    如果您使用NewAllocRetainCopy,则将计数加一。

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

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

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2012-03-05
      • 2011-09-10
      • 2015-07-23
      • 2011-01-02
      • 2012-12-12
      • 1970-01-01
      • 2021-09-02
      • 2011-08-08
      • 1970-01-01
      相关资源
      最近更新 更多