【问题标题】:Could a double release cause a crash?双重释放会导致崩溃吗?
【发布时间】:2011-01-21 01:31:01
【问题描述】:

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

这次崩溃让我完全困惑,如果有人能帮助我准确了解它为什么会崩溃以及我将来如何防止它崩溃,我将不胜感激。

提前致谢!

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    它看起来确实像双重释放,但它可能是数组中的对象之一,而不是数组本身。要追踪它,请在 Xcode 的 Zombies Instrument 下运行您的应用程序。最好在模拟器中执行此操作,因为这会占用大量内存。现在,当您重现崩溃时,您会发现有问题的对象是什么类。您还可以跟踪其保留/释放历史记录,以找出您在哪里破坏了它。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-07
        • 1970-01-01
        • 2012-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-31
        相关资源
        最近更新 更多