我正在为我的iOS应用程序在Crashlytics中获取一些崩溃日志,我对如何解释它们感到难过。我已经尝试了在我的应用程序中创建崩溃的所有内容,并且无法创建一个会导致堆栈跟踪的内容,如下所示:
Thread : Crashed: com.apple.main-thread
0 libobjc.A.dylib 0x397e6b26 objc_msgSend + 5
1 Foundation 0x2fcc7f8d -[NSError dealloc] + 60
2 libobjc.A.dylib 0x397f6b0b objc_object::sidetable_release(bool) + 174
3 Foundation 0x2fd241f5 -[NSFilesystemItemRemoveOperation dealloc] + 60
4 libobjc.A.dylib 0x397f6b0b objc_object::sidetable_release(bool) + 174
5 libobjc.A.dylib 0x397e8007 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 358
6 CoreFoundation 0x2f2de981 _CFAutoreleasePoolPop + 16
7 UIKit 0x31b1624d _wrapRunLoopWithAutoreleasePoolHandler + 36
8 CoreFoundation 0x2f3761cd __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
9 CoreFoundation 0x2f373b71 __CFRunLoopDoObservers + 284
10 CoreFoundation 0x2f373eb3 __CFRunLoopRun + 730
11 CoreFoundation 0x2f2dec27 CFRunLoopRunSpecific + 522
12 CoreFoundation 0x2f2dea0b CFRunLoopRunInMode + 106
13 GraphicsServices 0x34005283 GSEventRunModal + 138
14 UIKit 0x31b82049 UIApplicationMain + 1136
15 Pocket Linesman 0x000d5a8b main + 17 (main.m:17)
有谁知道如何解释这个堆栈跟踪的原因?当我从文件系统中删除我的应用程序中的对象时,似乎发生了某些事情,但我并不是百分百肯定。
答案 0 :(得分:3)
我们可以在回溯_CFAutoreleasePoolPop
中看到。
这意味着在当前运行循环的自动释放池试图释放标记为自动释放的对象时发生了崩溃......
通常,这意味着手动释放自动释放的对象 想象一下:
{
NSObject * o;
o = [ [ [ NSObject alloc ] init ] autorelease ];
[ o release ];
}
此处o
对象的保留计数为1
,并标记为自动释放,因此自动释放池的当前实例将在下次排空时向其发送release
消息
因此,对release
的手动调用是错误的,不会产生崩溃,因为对象仍在离开。但是该对象将被释放,使自动释放池留下对已释放对象的引用。
当游泳池耗尽时,它会尝试向该无效参考发送release
消息,您的应用会崩溃。
答案 1 :(得分:0)
通过内部NSFilesystemItemRemoveOperation
被解除分配,我猜你正在处理NSFileManager
removeItemAtPath:error:
周围有问题的内存管理问题。您是否在代码中的任何位置进行此调用?