尽管故意过度释放,但物体的保留计数从未低于1

Sta*_*ley 2 cocoa memory-management objective-c retaincount

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

NSLog(@"r = %d", [aObject retainCount];
Run Code Online (Sandbox Code Playgroud)

似乎我能得到的最低值是"r = 1",即使我故意添加额外的"释放"调用

[aObject release];
Run Code Online (Sandbox Code Playgroud)

即使我尝试将"释放"和"NSLog"测试代码放在对象的dealloc 方法中,"r = 1"限制仍然 有效.

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

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

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

Cat*_*Man 6

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

  • 尼基塔:尝试将其解释为无符号而非签名.对于不参与引用计数的对象,这是一个"魔术"保留计数.但基本上,不要使用-retainCount. (2认同)

Tho*_*mer 6

正如我从bbum(和其他人)那里学到的,不要使用retainCount.它不旨在提供关于对象的保留状态的信息.只需阅读" 内存管理编程指南",不要偏离其实践.不要试图retainCount用于你的内存管理.

请参阅我释放已分配或保留的对象的次数?,

何时使用-retainCount?,

等等