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 …