我正在调试一个奇怪的内存管理错误,但我无法弄清楚。我注意到我的一些对象在内存中停留的时间比预期的要长。我检查了所有内存管理,最后得出了一个非常不可能的结论:我的一些 autorelease
操作不会导致 release
。什么情况下可以呢?我创建了一个小型测试 Canary
类,该类在 dealloc
中记录一条消息,并具有以下测试代码:
NSLog(@"On the main thread: %i.", [NSThread isMainThread]);
[[[Canary alloc] init] autorelease];
根据代码,我们确实在主线程上,但是 Canary
中的 dealloc
直到很久以后才被调用。延迟是不确定的,很容易需要几秒钟或更长时间。这怎么可能?应用程序在 Mac 上运行,垃圾收集已关闭(Objective-C 垃圾收集在目标上设置为不支持。)我主要习惯于 iOS,是OS X 上的内存管理在某些重要方面有所不同?
最佳答案
autorelease
无法按预期运行的唯一情况是当前线程上没有自动释放池。只有少数情况会发生这种情况,如果确实发生,您会在控制台上打印一条非常响亮的日志消息。如果您没有看到该日志,则 autorelease
的行为正常。更有可能的情况是,您的代码中的某些内容正在调用此 Canary 对象的 retain
,然后永远不会释放它。
关于cocoa - 为什么我的自动释放对象没有被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5122000/