cocoa - 为什么我的自动释放对象没有被释放?

标签 cocoa macos memory-management autorelease

我正在调试一个奇怪的内存管理错误,但我无法弄清楚。我注意到我的一些对象在内存中停留的时间比预期的要长。我检查了所有内存管理,最后得出了一个非常不可能的结论:我的一些 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/

相关文章:

xcode - 从 Cocoa 中的图像中读取 EXIF/IPTC 信息

iphone - 使用 Xcode 处理循环中对象的正确方法

cocoa - NSUTF8StringEncoding 导致文件在 TextEdit/Pages 中渲染不正确,但在 BBEdit/vi 中则不会

objective-c - 将 CFStringRef 转换为 NSString

python - 我如何在 python 和 mac 应用程序之间进行通信?

macos - Mac 上的范围栏

c++ - 为什么这行得通? C中的字符指针

c++ - 从函数获取输出动态分配数组的更好变体?

objective-c - 来自 addGlobalMonitorForEventsMatchingMask 的通知可以取消吗?

objective-c - -[Foo类]:在[super dealloc]上发送到已释放实例的消息