现在我有了一个ClassA : NSObject,然后在视图控制器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?
发布于 2012-11-02 14:58:15
你永远不应该注意retainCount,它们往好了说是令人困惑,往坏了说则是误导。人们应该确保它们正确地遵循保留/释放的内存管理规则,并忘记retainCounts。
来自documentation..
此方法在调试内存管理问题时没有任何价值。由于任意数量的框架对象可能保留了一个对象以保存对它的引用,而同时自动释放池可能保存了对象上任意数量的延迟释放,因此您不太可能从此方法中获得有用的信息。
编辑:建议阅读
编辑:在看到OP的评论后
来自Cocoa Core Memory Management rules
当您创建或复制对象时,其保留计数为1。此后,其他对象可能表示对您的对象的所有权兴趣,这会增加其保留计数。对象的所有者也可以放弃其在该对象中的所有权权益,这会减少保留计数。当保留计数变为零时,对象将被释放(销毁)。
如果有人读到这篇文章,他/她可能会想,哦,retainCount是天赐的,我可以仅仅使用一条NSLog语句就能看到一个对象的完整的分配/保留/释放周期。但它实际上并不是这样工作的。你不能说,你拥有你创建的对象的独家所有权。该对象可以由任何其他框架对象保留。通过释放,你只是放弃了你的所有权。只有在所有其他对象移除其引用之后,该对象才会被释放。
我不知道为什么它仍然保留在公共API中。
发布于 2012-11-02 14:58:24
那是因为"retainCount is useless".
添加一些上下文:当消息传递一个“死”的对象时,你应该预料到未定义的行为。
发布于 2012-11-03 01:37:18
当你调用一个释放时,你不再持有a,所以a可能会被释放。这里可能就是这种情况,因为它的所有权不是共享的。
任何进一步发送给a的消息都有一个未定义的返回值:另一个对象可能重用了的内存插槽。
所以你打印的返回值基本上是随机的。它可能已经使你的应用程序崩溃或打印了1000个...
https://stackoverflow.com/questions/13190640
复制相似问题