自动释放池崩溃应用

Posted

技术标签:

【中文标题】自动释放池崩溃应用【英文标题】:Autorelease pool crashing App 【发布时间】:2011-01-17 11:32:15 【问题描述】:

我的自动释放池随机使我的应用崩溃,这个问题的常见原因是什么?

Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                 0x0145ba63 objc_msgSend + 23
1   CoreFoundation                  0x01210a6c CFRelease + 92
2   CoreFoundation                  0x012f2e8a -[__NSArrayM dealloc] + 170
3   CoreFoundation                  0x01210a6c CFRelease + 92
4   CoreFoundation                  0x01235b8d _CFAutoreleasePoolPop + 237
5   Foundation                      0x0005886c __NSFireDelayedPerform + 559
6   CoreFoundation                  0x012dafe3 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
7   CoreFoundation                  0x012dc594 __CFRunLoopDoTimer + 1220
8   CoreFoundation                  0x01238cc9 __CFRunLoopRun + 1817
9   CoreFoundation                  0x01238240 CFRunLoopRunSpecific + 208
10  CoreFoundation                  0x01238161 CFRunLoopRunInMode + 97
11  GraphicsServices                0x01c2e268 GSEventRunModal + 217
12  GraphicsServices                0x01c2e32d GSEventRun + 115
13  UIKit                           0x002e842e UIApplicationMain + 1160
14  FancyAPint                      0x000029e8 main + 102 (main.m:14)
15  FancyAPint                      0x00002979 start + 53

我知道这是因为一个对象被过度释放,我认为在自动释放池试图释放对象之前释放它是正确的。因此自动释放池试图过度释放一个对象?

【问题讨论】:

【参考方案1】:

您的评估是正确的。尝试使用模拟器中的“Zombies”工具运行您的应用程序,或将 NSZombieEnabled 环境变量设置为 YES。这些都将为您提供有关哪些对象被过度释放的更多信息。

【讨论】:

结合使用 NSZombie 并检查崩溃日志,我能够找到问题所在,即在自动释放池中释放的类 dealloc 中释放的对象。【参考方案2】:

这将是因为额外的内存释放。不要释放在自动释放池中分配的对象,并从拥有自己内存的对象中初始化。这可能是这背后的一个原因,因为我也面临这个问题。

【讨论】:

以上是关于自动释放池崩溃应用的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:自定义自动释放池中的崩溃

为啥这个简单的 NSWindow 创建代码会在 ARC 下关闭时触发自动释放池崩溃?

如何找到带有自动释放消息的对象?

当自动释放池耗尽时,NSFileAttributes dealloc 中的 SIGSEGV SEGV_ACCERR 崩溃?

释放自动释放对象不会使我的应用程序崩溃,为啥?

自动释放池页面损坏