对象'保留计数永远不会低于1尽管故意过度释放

时间:2011-02-07 22:52:51

标签: objective-c cocoa memory-management retaincount

我正在检查某些对象的保留计数

NSLog(@"r = %d", [aObject retainCount];

似乎我能得到的最低值是“r = 1”,即使我故意添加额外的“释放”电话

[aObject release];

即使我尝试将“释放”和“NSLog”测试代码放在对象的dealloc方法中,“r = 1”限制仍然存在。

Cocoa运行时似乎忽略了我的额外版本,直到“r = 1”,然后在示例程序的最后一个“EXC_BAD_ACCESS”崩溃(没有GC)。

我唯一的解释(猜测)是我们需要r> = 1来访问对象。并且Cocoa运行时只是试图避免让任何对象的保留计数过早地变为0。

如果我错了,有人可以确认或纠正我吗?

6 个答案:

答案 0 :(得分:6)

当一个对象的保留计数即将达到0(即它的保留计数为1,并且再次调用释放)时,它会被释放而不是费心去做最后的减量。

答案 1 :(得分:6)

正如我从bbum(及其他人)那里学到的,不要使用retainCount。它不旨在提供关于对象的保留状态的信息。请阅读Memory Management Programming Guide,不要偏离其做法。不要尝试使用retainCount进行内存管理。

请参阅How many times do I release an allocated or retained object?

When to use -retainCount?

答案 2 :(得分:3)

如果retainCount永远== 0,则奇点已经实现!

鸡见蛋。或者是鸡蛋会遇到鸡肉。

根据定义,释放具有单个剩余保留的对象意味着该对象被释放。任何后续方法调用都将导致未定义的行为。

答案 3 :(得分:1)

Instruments工具提供Zombie检测,这比尝试自己调试Cocoa的引用计数更有效。使用Xcode的Run>使用Performance Tool运行>僵尸命令。它会检测您何时在已发布对象上调用方法,并显示对象的整个生命周期的保留/释放历史记录。自Apple添加此工具以来,生活就好多了。

答案 4 :(得分:0)

基于引用计数内存管理的理念是,在引用> = 1次时,对象存在。 retainCount = 0理论上意味着该对象不再被引用,这就是您无法获取[aObject retainCount] == 0;的原因,因为如果您仍然可以传递消息,则该对象存在并仍由{{1}引用},因此至少 retainCount = 1。

答案 5 :(得分:0)

当一个对象的引用变为0时,该对象变为“zombie object”,但你仍然可以向它发送retainCount消息,因为默认情况下Xcode没有在Memory Management中“启用Zombie Objects”,这意味着Xcode没有检查僵尸对象。

如果您通过“编辑方案 - >运行 - >诊断 - >启用僵尸对象”中的“启用僵尸对象”勾选Xcode检查僵尸对象,当您继续向对象发送消息时,您将收到错误消息在它的引用变为0之后。

快照:

enter image description here