关于retainCount的iOS

时间:2012-11-02 06:51:10

标签: ios retaincount

现在我有一个ClassA : NSObject,然后在viewcontroller viewDidLoad中查看下面的代码:

- (void)viewDidLoad {
    ClassA *a = [[ClassA alloc] init];
    NSLog(@"a retainCount = %d", [a retainCount]);
    ClassA *b = a;
    NSLog(@"a retainCount = %d b retainCount= %d ", [a retainCount],[b retainCount]);
    [a release];
    NSLog(@"a retainCount = %d b retainCount= %d", [a retainCount],[b retainCount]);
    [super viewDidLoad];
}

控制台输出如下:

2012-11-02 14:43:35.437 RetainCountTest[1043:207] a retainCount = 1
2012-11-02 14:43:35.439 RetainCountTest[1043:207] a retainCount = 1 b retainCount= 1  
2012-11-02 14:43:35.439 RetainCountTest[1043:207] a retainCount = 1 b retainCount= 1

我不明白,当我致电[a release]时,为什么[a retainCount]== 1

3 个答案:

答案 0 :(得分:4)

那是因为“retainCount is useless”。

添加一些上下文:在发送“死”的对象时,您应该期望未定义的行为。

答案 1 :(得分:1)

你永远不应该关注retainCount。它们充其量是令人困惑的,最糟糕的是误导性。应该确保它们正确遵循保留/释放的内存管理规则,并忘记retainCounts。

来自documentation ..

  

此方法在调试内存管理问题时没有任何价值。   因为任何数量的框架对象都可能保留了一个对象   为了保持对它的引用,同时自动释放   池可能在一个对象上持有任意数量的延迟版本   你不太可能从这种方法中获得有用的信息。

编辑:建议阅读

When to use -retainCount?

编辑:看到OP的评论后

来自Cocoa Core Memory Management rules

  

创建或复制对象时,其保留计数为1.此后   其他对象可能表示对象的所有者权益,即   增加其保留计数。对象的所有者也可以   放弃对它的所有者权益,这减少了保留   计数。当保留计数变为零时,将取消分配对象   (破坏)。

如果有人读过这篇文章,他/她可能会想,哦retainCount是godsent,我只能使用NSLog语句看到对象的完整alloc / retain / release周期。但它并没有真正起作用。您不能说,您拥有自己创建的对象的所有权。该对象可能被任何其他框架对象保留。通过发布,您只是放弃了您的所有权。只有在所有其他对象删除其引用后,才会释放该对象。

我不知道为什么它仍然存在于公共API中。

答案 2 :(得分:1)

当你打电话给[发布]时,你不再坚持了,所以可能会被取消分配。这可能是因为它的所有权是共享的。

a的任何进一步消息都有一个未定义的返回值:另一个对象可能重用了一个内存插槽。

因此,您打印的返回值基本上是随机的。它可能已经崩溃你的应用程序或打印1000 ...