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 = %db retainCount= %d ", [a retainCount],[b retainCount]); [a release]; NSLog(@"a retainCount = %db 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

你不应该注意retainCount的。 他们至多混乱,最糟糕的是误导。 应该确保它们正确地遵循保留/释放的内存pipe理规则,并忘记retainCounts。

来自文件 ..

这种方法在debugging内存pipe理问题上没有任何价值。 因为任何数量的框架对象可能保留了一个对象来保存对它的引用,同时autorelease池可能在对象上保存了任意数量的延迟发布,所以很难从这个对象获得有用的信息方法。

编辑:推荐阅读

何时使用-retainCount?

编辑:在看到OP的评论

从cocoa核心内存pipe理规则

创build或复制对象时,其保留计数为1.其后,其他对象可能会在对象中表示所有权,从而增加保留计数。 对象的所有者也可能放弃对它的所有权利益,这减less了保留数量。 当保留计数变为零时,对象被解除分配(销毁)。

如果有人阅读,他/她可能会认为,哦retainCount是上帝,我可以看到一个完整的使用NSLog语句的对象的alloc / retain / release周期。 但实际上并不是这样。 您不能说,您拥有您创build的对象的唯一所有权。 该对象可能被任何其他框架对象保留。 通过释放你只是放弃你的所有权。 只有在所有其他对象删除其引用后,该对象才会被释放。

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

那是因为“ retainCount是无用的 ”。

添加一些上下文:当发送一个“死”的对象时,你应该期待未定义的行为。

当你打电话给[发行版]时,你不再坚持,所以可能会被释放。 这可能是因为它的所有权是共同的。

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

所以你打印的返回值本质上是随机的。 它可能已经崩溃了您的应用程序或打印1000 …