调试内存管理问题很令人头疼。向业已回收的对象发送消息是不安全的。这么做有时可以,有时不行。具体可行与否,完全取决于对象所占内存有没有为其他内容所覆写。而这块内存有没有移作他用,又无法确定,因此,应用程序只是偶尔崩溃。在没有崩溃的情况下,那块内存可能只复用了其中一部分,所以对象中的某些二进制数据依然有效。还有一种可能,就是那块内存恰好为另外一个有效且存活的对象所占据。在这种情况下,运行期系统会把消息发到新对象那里,而此对象也许能应答,也不不能。如果能,那程序就不崩溃,可你会觉得奇怪,为什么收到消息的对象不是预想的那个呢?若新对象无法响应选择子,则程序依然会崩溃。
Cocoa提供了"僵尸对象"(Zombie Object)这个非常方便的功能。启用这项调试功能之后,运行期系统会把所有已经回收的实例转化成特殊的"僵尸对象",而不会真正回收它们。这种对象所在的核心内存无法重用,因此不可能遭到覆写。僵尸对象收到消息后,会抛出异常,其中准确说明了发送过来的消息,并描述了回收之前的那个对象。僵尸对象是调试内存管理问题的最佳方式。
在Xcode里打开此选项,这样的话,Xcode在运行应用程序时会自动设置环境变量。开启方法为: 编辑应用程序的Scheme,在对话框左侧选择"Run",然后切换至"Diagnostics"分页,最后勾选"Zombie Object"选项。
网友评论