objc_release EXC_BAD_ACCESS

时间:2012-09-14 18:18:51

标签: ios5 core-data automatic-ref-counting grand-central-dispatch ios6

无法确定此错误发生了什么。

我正在上传多个细分的文件。

我已将api调用线程化为7个并发线程。

以下是它停止的汇编代码。

Assembly Code

这是我的打印堆栈跟踪

Printed Stack Trace

最后是Stack窗口

Stack Window

除了dispatch_get_low()的#define之外,我没有任何DISPATCH_QUEUE_PRIORITY_LOW,而且我没有调用dispatch_get_low()

作为一个小背景,我正在从xcode 4.4开发我的应用程序,最近安装了GM Seed 4.5来测试ios 6.我的所有代码仍然是ios5,这个错误在xcode更新之前和之后困扰着我。

更新

将NSZombieEnabled YES添加回我的环境变量

NSZombieEnabled environment variable

我以同样的方式呈现了一个不同的错误,但这个被称为转发

程序集断点

Breakpoint Assembly

堆栈跟踪打印输出

Stack Trace Printout

调用堆栈窗口

Call Stack Window

我仍然对实际发生的事情感到茫然。

我还在调查。任何进一步的帮助将不胜感激。

====新发展====

显然在尝试获取malloc调用的一些输出时。我完全缓解了这个错误。

这令人沮丧,因为我不认为我可以在启用此标志的情况下编译发布。

enter image description here

EXC_BAD_ACCESS不再出现,因此日志将无用。这个bug已经成为我遇到的最奇怪的问题,而且我遇到了很多奇怪的iOS漏洞。

再次更新

我一直在追踪这个错误。原来问题的对象是-[CFNumber release]调用该数字是在一个块中创建的,然后传递给委托。

它也可以与Core Data对象组合保存然后离开。

我添加了一个记录行号和文件名的HSLogBrute(@“”)方法。

我已将其跟踪到以下代码。

    if (progressMatch > progressPercent){
        HSLogBrute(@"");
        TransferStatus *transferStatus = [TransferStatus objectByID:task.transferStatusID];
        HSLogBrute(@"");
        transferStatus.segmentsTransferred = [NSNumber numberWithInt:segmentsTransferred.intValue];
        HSLogBrute(@"");
        transferStatus.segmentsTotal = [NSNumber numberWithInt:segmentsTotal.intValue];
        HSLogBrute(@""); // This is the last log I am getting.
        [transferStatus save];
        HSLogBrute(@"");
    }
    HSLogBrute(@"");// Before putting in the [NSNumber numberWithInt:] calls this was the last line.

1 个答案:

答案 0 :(得分:0)

原来我们正在创建一个NSMutableDictionary并在其中使用数字。像我们一样快速地创建和销毁NSNumber似乎在某种程度上混淆了弧。并且对象被保留并且不按顺序发布。

我的解决方案是创建一个自定义对象,其中包含我需要的数字。并递增和递减这些原始数字类型,而不是创建和销毁这么多NSNumber值。