我正在调试一个奇怪的内存管理错误,但无法解决。我注意到我的某些对象在内存中的停留时间比预期的要长。我检查了所有的内存管理,最后得出一个非常不可能的结论,即我的某些autorelease操作不会导致release。在什么情况下可行?我创建了一个小型测试Canary类,该类将消息记录在dealloc中并具有以下测试代码:

NSLog(@"On the main thread: %i.", [NSThread isMainThread]);
[[[Canary alloc] init] autorelease];


根据代码,我们实际上位于主线程上,但是dealloc中的Canary直到很晚才被调用。延迟不是确定的,很容易花费几秒钟或更长时间。那怎么可能?该应用程序在Mac上运行,垃圾收集已关闭(目标上的Objective-C垃圾收集设置为``不支持''。)我最习惯于iOS,OS X上的内存管理在某些重要方面是否有所不同?

最佳答案

autorelease表现不正常的唯一情况是当前线程上没有自动释放池时。在少数情况下,您可以预期会发生这种情况,如果发生这种情况,您会在控制台上收到非常响亮的日志消息。如果没有看到该日志,则autorelease的行为适当。事实上,代码中的某些内容正在对该Canary对象调用retain,然后再从不释放它。

10-08 07:30