2

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

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

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

[aObject release];

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

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

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

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

4

6 回答 6

6

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

于 2011-02-07T22:55:09.350 回答
6

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

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

何时使用 -retainCount?,

等等

于 2011-02-07T23:10:20.143 回答
3

如果retainCount ever == 0,那么奇点就实现了!

鸡遇蛋。或者是鸡蛋遇到鸡。

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

于 2011-02-07T23:58:34.653 回答
1

Instruments 工具提供了僵尸检测,这比尝试自己调试 Cocoa 的引用计数更有效。使用 Xcode 的 Run > Run with Performance Tool > Zombies 命令。它检测您何时在已释放对象上调用方法并显示对象完整生命周期的保留/释放历史记录。自从苹果添加了这个工具后,生活变得更好了。

于 2011-02-08T03:59:55.193 回答
0

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

于 2011-02-07T23:10:28.783 回答
0

当一个对象的引用变为 0 时,这个对象就变成了“僵尸对象”,但是你仍然可以给它发送 retainCount 消息,这是因为 Xcode 默认没有在内存管理中“启用僵尸对象”,这意味着 Xcode 没有检查僵尸对象.

如果您通过在“Edit Scheme->Run->Diagnostics->Enable Zombie Objects”中勾选“Enable Zombie Objects”使 Xcode 检查僵尸对象,当对象的引用变为 0 后继续向对象发送消息时,您将收到错误消息。

快照:

在此处输入图像描述

于 2015-07-31T07:52:07.673 回答