autoreleasePool排水管崩溃

时间:2013-12-02 11:22:52

标签: objective-c memory-management

我在[pool drain]中有一个罕见的(匿名命名空间):: AutoreleasePoolPage :: pop(void *)崩溃。据我所知,它是由自动释放池拥有的某些对象的过度释放引起的。

我尝试使用NSZombieEnabled = YES,并使用带有僵尸追踪器的乐器。这些错误不可复制。控制台中没有记录过度释放消息,僵尸跟踪器不显示任何僵尸警报。但是当我取下这些旗帜时,崩溃是非常频繁的。有人看到过类似的行为吗?

还有其他方法可以轻松调试吗?我在OS 10.8.5中使用Xcode 5.0.1。我正在粘贴下面的崩溃线程:

异常类型:EXC_BAD_ACCESS(SIGSEGV)

异常代码:EXC_I386_GPFLT

特定应用信息: objc_msgSend()选择器名称:release

  

0 libobjc.A.dylib 0x00007fff8b3040a3 objc_msgSend +35

     

1 com.apple.CoreFoundation 0x00007fff855d086f CFRelease + 591

     

2 com.apple.CoreFoundation 0x00007fff856028a9    - [__ NSDictionaryM dealloc] + 249

     

3 libobjc.A.dylib 0x00007fff8b30665a(匿名   namespace):: AutoreleasePoolPage :: pop(void *)+ 502

     

4 com.apple.ist.istcore 0x000000010fb91d82    - [SomeFileOperation main] + 117

     

5 com.apple.Foundation 0x00007fff81f2070b    NSThread__main + 1318

     

6 libsystem_pthread.dylib 0x00007fff86389899 _pthread_body +   138

     

7 libsystem_pthread.dylib 0x00007fff8638972a _pthread_start +   137

     

8 libsystem_pthread.dylib 0x00007fff8638dfc9 thread_start +   13

提前致谢。

1 个答案:

答案 0 :(得分:0)

[__NSDictionaryM dealloc]

正在取消分配字典。

CFRelease

当取消分配字典时,每个键和值都会收到release条消息。

但是,字典中的一个对象已经被释放,这意味着发送另一条release消息会导致非法访问。

检查字典中的键/值,你是否过度释放其中一个。我建议您还要执行完整的项目清理,然后进行深入分析(请参阅Project菜单)。在大多数情况下,这将帮助您找到错误。

您还可以向NSDictionary dealloc添加符号断点,等待它触发,然后使用调试器检查内部数据的状态。