【发布时间】:2011-02-25 19:58:51
【问题描述】:
我正在调试一个奇怪的内存管理错误,但我无法弄清楚。我注意到我的一些对象在内存中的停留时间比预期的要长。我检查了我所有的内存管理,最后得出了一个非常不可能的结论,即我的一些autorelease 操作不会导致release。在什么情况下可能?我创建了一个小型测试 Canary 类,它在 dealloc 中记录一条消息,并有以下测试代码:
NSLog(@"On the main thread: %i.", [NSThread isMainThread]);
[[[Canary alloc] init] autorelease];
根据代码,我们确实在主线程上,但 Canary 中的 dealloc 直到很久以后才会被调用。延迟不是确定性的,很容易花费几秒钟或更长时间。这怎么可能?应用程序在 Mac 上运行,垃圾收集已关闭(Objective-C Garbage Collection 在目标上设置为 Unsupported。)我主要习惯于 iOS,是OS X 上的内存管理在某些重要方面有何不同?
【问题讨论】:
-
Mac OS X下的内存管理不同之处在于可以使用GC。如果您不选择 GC,那么不,没有什么不同。
标签: cocoa macos memory-management autorelease