双重释放会导致崩溃吗?

时间:2011-01-21 01:31:02

标签: iphone objective-c ios

我的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];

这次崩溃让我感到非常困惑,如果有人能帮我理解为什么会崩溃以及如何防止它在将来崩溃,我将不胜感激。

提前致谢!

2 个答案:

答案 0 :(得分:2)

它看起来像是一个双版本,但它可能是数组中的一个对象,而不是数组本身。要跟踪它,请在Xcode的Zombies Instrument下运行您的应用程序。最好在模拟器中执行此操作,因为这会占用大量内存。现在,当您重现崩溃时,您将找出违规对象是什么类。您还可以跟踪其保留/发布历史记录,以找出您打破它的位置。

答案 1 :(得分:0)

这看起来不像发送到您的阵列的发布消息 - 这看起来像发送到您存储在数组中的对象之一的发布消息。

如果我理解正确,你将从数组中删除一个对象,然后释放它,然后系统尝试向该对象发送一条消息。