【问题标题】:NSArray release crashes with EXC_BAD_ACCESSNSArray 版本因 EXC_BAD_ACCESS 而崩溃
【发布时间】:2011-04-05 11:33:27
【问题描述】:

另一个谜题。我有一个包含 3 个对象和 1 个保留计数的 NSArray (iTours)。

这个Array在对象dealloc方法中释放如下:

- (void)dealloc {
    NSLog(@"retain count für iTouren: %d", [iTours retainCount]);
    [iTours release];  // triggers EXC_BAD_ACCESS 
    [super  dealloc];
}

控制台窗口显示以下消息(没有更多详细信息):

节目接收信号: “EXC_BAD_ACCESS”。

有什么线索吗?我错过了什么?

【问题讨论】:

    标签: iphone objective-c xcode


    【解决方案1】:

    已释放和解除分配的对象的保留计数为 1。即将释放和解除分配的未释放对象的保留计数也将为 1。(假设曾经为该对象分配内存,一些字符串和数字永远不会分配,实现细节随 Mac OS X 版本而变化)

    当一个对象在当前版本的 Mac OS X 中被释放时,内存被标记为空闲,没有任何关于对象的修改(除非你告诉它)。因此,保留计数与释放之前的保留计数保持一致。

    这是让 Mac OS X 如此稳固的犯错和 DIAF 方法。

    【讨论】:

      【解决方案2】:

      永远,永远,永远,依赖于 retainCount 方法。

      曾经。

      我有没有提到过?

      【讨论】:

        【解决方案3】:

        确保您的数组不包含自身。释放一个数组也会释放其中的每个对象。当然,如果是这种情况,数组在释放之前应该有两个释放计数,因为数组保留了它们的元素。

        【讨论】:

          【解决方案4】:

          假设iToursiTouren 是不同的对象(即iTours 是一个包含iTourenNSArray),你已经过度释放了iTours;也许你的 setter 失败了,iTours 在没有被重新分配和保留的情况下被释放。

          【讨论】:

            【解决方案5】:

            一个是iTours,另一个是iTouren。您正在记录与正在释放的对象不同的对象。

            【讨论】:

            • iTours 是一个包含 3 个对象的数组,其中一个是 iTouren。至少这是问题的第一行所暗示的。
            • 对不起,这两者都是 iTours ......我编辑错误......现在更正了
            【解决方案6】:

            很可能,您过度释放了iTouren,因此,对release 的调用导致了崩溃。也就是说,iTouren 在您释放包含数组时已经被释放,当包含数组将release 发送到已经释放的iTouren 时,您的应用程序崩溃了。

            (当然iTours可能是已经被释放的对象,无论如何都是过度释放的问题。)

            打开僵尸检测,看看这是否会解决具体问题。

            注意

            retainCount 返回的数字没有用

            。绝对保留计数是一个实现细节,通常是一个看起来像废话的特定值。

            在这种情况下,对象的最终release 不会减少保留计数。为什么?因为当对象即将被释放时,那将是一个浪费的循环。 retainCount 不可能返回 0,因为根据定义,保留计数为 0 的对象已被释放,因此无论如何它不再是可行的消息接收器。

            【讨论】:

            • Zombie 确认了过度发布。现在我想知道为什么,因为我在 init 方法中声明并分配了数组。可能与作为推送到导航堆栈上的视图的对象有关。 ....但是我首先需要调查...如果我无法弄清楚,将记录一个新问题。谢谢你的帮助!
            • 使用集合类,还要检查您是否没有过度释放任何收集的对象...怀疑释放集合将释放所有收集的对象,这可能会导致段错误点
            猜你喜欢
            • 2011-03-13
            • 1970-01-01
            • 1970-01-01
            • 2012-05-10
            • 1970-01-01
            • 2013-07-16
            • 1970-01-01
            • 1970-01-01
            • 2019-05-08
            相关资源
            最近更新 更多