Obj-C消息发送到解除分配的对象(EXC_BAD_ACCESS),带有iOS5,ARC

时间:2012-01-21 03:00:01

标签: objective-c ios5 automatic-ref-counting exc-bad-access

我正在使用ARC开发一个iOS5应用程序,我开始得到一些我无法弄清楚的随机EXEC_BAD_ACCESS崩溃。随机我的意思是它非常不可预测:有时可能需要很长时间才能崩溃,有时会短暂。而且也没有一个特定的按钮/ tablecell /等。触发崩溃。每次用户交互都可能导致应用程序崩溃,但您无法重复崩溃。

我试图打开NSZombie以及一些malloc调试工具。在Instruments中,崩溃错误读取:Objective-C消息被发送到地址为0x10bd1b40的解除分配对象(僵尸)。引用计数日志的最后一部分如下所示:

475 CoursesFirstViewController  Release 2   02:23.253.631   0   UIKit   -[UINibDecoder finishDecoding]
476 CoursesFirstViewController  Release 1   02:23.253.838   0   Foundation  -[NSAutoreleasePool drain]
477 CoursesFirstViewController  Zombie  -1  02:35.752.420   0   Foundation  objectHash

2,1,1,-1是参考计数。我不知道为什么它会跳过0并降为-1,从而导致程序崩溃(所有条目但最后一条都有连续的引用计数)。我也不知道objectHash是什么。

我的应用程序包含多个功能,可在主屏幕上作为图标访问。 CoursesFirstViewController是其中一个功能。总是,它是CoursesFirstViewController和objectHash使应用程序崩溃,即使我在其他地方。 (这是上面的日志的情况:我在02:23离开了CoursesFirstViewController(因此返回到我的应用程序的主屏幕),但是在12秒之后,当我在其他一些功能时,应用程序崩溃了)我只需要输入CourseFirstViewController,搞砸了一下,然后去其他地方继续使用该应用程序,过了一会儿就会崩溃。

我现在真的很生气。我已经搜索了SO和Google很长一段时间但找不到解决方案。任何帮助将非常感激。谢谢!

3 个答案:

答案 0 :(得分:2)

  

@robmayoff是的,我已经检查了但是没有看到任何特别有用的东西。最后几个调用是objectHash,hashProbe,[NSConcreteHashTable rehashAround],[NSConcreteHashTable removeItem]等。

这实际上有点用处。这告诉我们一个集合,可能是NSDictionary,但可能是NSSet正在被销毁。从您之前的信息来看,它似乎是在nib实例化过程中创建的自动释放的集合(因此可能是CoursesFirstViewController的ivar)。无论如何,这都是我在寻找症状的地方,但崩溃似乎证实了这一点。

一般建议是审核任何__bridge演员表或unsafe_unretained属性。

另一个预感是你以违反Cocoa内存管理的方式命名了一个方法。最可能的错误是您拥有以newcopy开头的属性。如果您有ARC代码调用错误名称的非ARC代码,这肯定会成为一个问题。

答案 1 :(得分:0)

我怀疑你的某个属性标记为“弱”,它应该是“强大的”并且超出范围并在访问之前获得释放。在这种情况下,ARC无法保存您,您将获得上述随机崩溃行为。

如果你没有找到任何运气,我会在你的项目中进行全局搜索“弱”属性,并仔细检查每个属性,以确保它不是你想要的东西。这很乏味但老实说不需要花很长时间才能完成,有时会比一个错误更多。

答案 2 :(得分:0)

我从您的仪器输出中收集到僵尸对象的类型为CoursesFirstViewController。我们经常使用视图控制器作为其他对象的委托,并且大多数拥有委托的对象都不会保留其委托。

我假设您没有使用任何unsafe_unretained属性或变量,或任何retain类型属性。所以我假设你的任何对象都没有保留对CoursesFirstViewController僵尸的悬空引用。

由于系统库必须使用非ARC代码,因此它们不使用ARC的弱引用。因此,如果某个系统对象具有CoursesFirstViewController作为其委托,并且CoursesFirstViewController被销毁但系统对象不被销毁,那么系统对象将留下对被破坏对象的悬空引用。

因此,请检查您是否使用CoursesFirstViewController作为任何系统对象的委托。如果是这样,您确定这些对象的寿命不会超过CoursesFirstViewController吗?