现在我有一个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
?
答案 0 :(得分:4)
那是因为“retainCount is useless”。
添加一些上下文:在发送“死”的对象时,您应该期望未定义的行为。
答案 1 :(得分:1)
你永远不应该关注retainCount。它们充其量是令人困惑的,最糟糕的是误导性。应该确保它们正确遵循保留/释放的内存管理规则,并忘记retainCounts。
来自documentation ..
此方法在调试内存管理问题时没有任何价值。 因为任何数量的框架对象都可能保留了一个对象 为了保持对它的引用,同时自动释放 池可能在一个对象上持有任意数量的延迟版本 你不太可能从这种方法中获得有用的信息。
编辑:建议阅读
编辑:看到OP的评论后
来自Cocoa Core Memory Management rules
创建或复制对象时,其保留计数为1.此后 其他对象可能表示对象的所有者权益,即 增加其保留计数。对象的所有者也可以 放弃对它的所有者权益,这减少了保留 计数。当保留计数变为零时,将取消分配对象 (破坏)。
如果有人读过这篇文章,他/她可能会想,哦retainCount是godsent,我只能使用NSLog语句看到对象的完整alloc / retain / release周期。但它并没有真正起作用。您不能说,您拥有自己创建的对象的所有权。该对象可能被任何其他框架对象保留。通过发布,您只是放弃了您的所有权。只有在所有其他对象删除其引用后,才会释放该对象。
我不知道为什么它仍然存在于公共API中。
答案 2 :(得分:1)
当你打电话给[发布]时,你不再坚持了,所以可能会被取消分配。这可能是因为它的所有权是共享的。
对a
的任何进一步消息都有一个未定义的返回值:另一个对象可能重用了一个内存插槽。
因此,您打印的返回值基本上是随机的。它可能已经崩溃你的应用程序或打印1000 ...