我的iOS应用程序已经崩溃了一些用户。我能够检索他们的崩溃日志并对其进行符号化。
几乎每次崩溃都是这样......
0 libobjc.A.dylib 0x34a80466 objc_msgSend + 18
1 CoreFoundation 0x357e0f74 -[NSObject(NSObject) release] + 24
2 CoreFoundation 0x357e53c2 CFRelease + 62
3 CoreFoundation 0x35825fe6 -[__NSArrayM removeObjectAtIndex:] + 82
4 CoreFoundation 0x358237ae -[NSMutableArray removeAllObjects] + 30
5 [appName] 0x00006396 -[MainView actionSheet:clickedButtonAtIndex:] (MainView.m:790)
正如您在2和1中看到的那样,我的阵列被释放了两次。在第二次发布后,应用程序发送objc_msgSend并且应用程序崩溃。是因为数组正在发布两次而崩溃吗?
此外,我的数组是这样创建的:
someArray = [[NSMutableArray alloc] init];
我只在我的dealloc中发布这个数组:
- (void)dealloc {
[someArray release];
}
结果我只发布一次,在我的dealloc中,由于被释放两次会怎么崩溃?
最后,关于这次崩溃的另一个奇怪的事情是它有时只会发生,它不一致。正如您在崩溃日志的第5行所看到的,按下了一个操作表按钮。该印刷机上只有一行正在执行:
[someArray removeAllObjects];
这次崩溃让我感到非常困惑,如果有人能帮我理解为什么会崩溃以及如何防止它在将来崩溃,我将不胜感激。
提前致谢!
答案 0 :(得分:2)
它看起来像是一个双版本,但它可能是数组中的一个对象,而不是数组本身。要跟踪它,请在Xcode的Zombies Instrument下运行您的应用程序。最好在模拟器中执行此操作,因为这会占用大量内存。现在,当您重现崩溃时,您将找出违规对象是什么类。您还可以跟踪其保留/发布历史记录,以找出您打破它的位置。
答案 1 :(得分:0)
这看起来不像发送到您的阵列的发布消息 - 这看起来像发送到您存储在数组中的对象之一的发布消息。
如果我理解正确,你将从数组中删除一个对象,然后释放它,然后系统尝试向该对象发送一条消息。