#0 0x345bbc98 in objc_msgSend ()
#1 0x35cd3616 in -[_PFManagedObjectReferenceQueue _processReferenceQueue:] ()
#2 0x35cd32b2 in _performRunLoopAction ()
#3 0x31458a34 in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#4 0x3145a464 in __CFRunLoopDoObservers ()
#5 0x3145b75a in __CFRunLoopRun ()
#6 0x313ebec2 in CFRunLoopRunSpecific ()
#7 0x313ebdca in CFRunLoopRunInMode ()
#8 0x354d941e in GSEventRunModal ()
#9 0x354d94ca in GSEventRun ()
#10 0x36a03d68 in -[UIApplication _run] ()
#11 0x36a01806 in UIApplicationMain ()
#12 0x00002b6a in main (argc=1, argv=0x2fdff494) at /Projects/iOS_Universal/main.m:14
我怎么知道哪个对象过度发布。我的应用程序运行NSZombieEnabled也尝试了一些gdb命令但没有得到任何帮助
答案 0 :(得分:1)
在调试器中设置MallocStackLogging和guard malloc。然后,当您的应用程序崩溃时,请在gdb控制台中输入:
(gdb) info malloc-history 0x543216
将0x543216替换为导致崩溃的对象的地址,您将获得更有用的堆栈跟踪,它可以帮助您查明代码中导致问题的确切行。
答案 1 :(得分:0)
在Exceptions上添加一个断点(Xcode 4使这很简单)然后重新运行并崩溃你的应用程序。您可能会在碰撞发生时获得一个断点。从那里你可以po
各种对象,直到你遇到导致调试器抱怨的对象为止。
如果您有NSZombieEnabled并且它没有在过度发布上抛出异常,那么您可能只是访问已发布的对象。最好的预防方法是nil
您释放的任何对象。
答案 2 :(得分:0)
这是由于来自两个不同线程的核心数据db的并发访问,即主线程&后台线程