我正在检查某些对象的保留计数
NSLog(@"r = %d", [aObject retainCount];
似乎我能得到的最低值是“r = 1”,即使我故意添加额外的“释放”电话
[aObject release];
即使我尝试将“释放”和“NSLog”测试代码放在对象的dealloc
方法中,“r = 1”限制仍然存在。
Cocoa运行时似乎忽略了我的额外版本,直到“r = 1”,然后在示例程序的最后一个“EXC_BAD_ACCESS”崩溃(没有GC)。
我唯一的解释(猜测)是我们需要r> = 1来访问对象。并且Cocoa运行时只是试图避免让任何对象的保留计数过早地变为0。
如果我错了,有人可以确认或纠正我吗?
答案 0 :(得分:6)
当一个对象的保留计数即将达到0(即它的保留计数为1,并且再次调用释放)时,它会被释放而不是费心去做最后的减量。
答案 1 :(得分:6)
正如我从bbum(及其他人)那里学到的,不要使用retainCount
。它不旨在提供关于对象的保留状态的信息。请阅读Memory Management Programming Guide,不要偏离其做法。不要尝试使用retainCount
进行内存管理。
请参阅How many times do I release an allocated or retained object?,
等
答案 2 :(得分:3)
鸡见蛋。或者是鸡蛋会遇到鸡肉。
根据定义,释放具有单个剩余保留的对象意味着该对象被释放。任何后续方法调用都将导致未定义的行为。
答案 3 :(得分:1)
Instruments工具提供Zombie检测,这比尝试自己调试Cocoa的引用计数更有效。使用Xcode的Run>使用Performance Tool运行>僵尸命令。它会检测您何时在已发布对象上调用方法,并显示对象的整个生命周期的保留/释放历史记录。自Apple添加此工具以来,生活就好多了。
答案 4 :(得分:0)
基于引用计数的内存管理的理念是,在引用> = 1次时,对象存在。 retainCount = 0理论上意味着该对象不再被引用,这就是您无法获取[aObject retainCount] == 0;
的原因,因为如果您仍然可以传递消息,则该对象存在并仍由{{1}引用},因此至少 retainCount = 1。
答案 5 :(得分:0)