在dealloc之后,应用程序在iOS5上崩溃

时间:2011-10-25 12:40:22

标签: ios ios5 automatic-ref-counting

我在iOS 5上运行应用程序时遇到问题,在iOS 4.3上运行正常。我已经将项目转换为ARC,因此应该完全禁用ARC,据我所知,应用程序应该像手动引用计数一样运行吗?它在dealloc方法之后崩溃(在调用[super dealloc]之后),更准确地说它在这部分得到了EXC_BAD_ACCESS:

int main(int argc,char * argv []){

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

int retVal = UIApplicationMain(argc, argv, nil, nil); //EXC_BAD_ACCESS

[pool release];

return retVal;

}

我试图转换为ARC,但目前这不可能,因为我有第三方JSON库不受支持。我试图将编译器标志放在所有适当的文件上:

-fno-objc弧

然而,当尝试转换为ARC时没有任何区别,因为同样的错误会像以前一样出现,而且Xcode会在尝试失败后从文件中删除标志。

有谁知道这里发生了什么?我会假设如果ARC被禁用,那么诸如发布之类的调用应该没问题吗?

2 个答案:

答案 0 :(得分:4)

听起来像是从iOS 4到iOS 5.0的框架更改意味着你正在击中一个悬垂的指针。 main中的EXEC_BAD_ACCESS通常是自动释放池中的对象已被解除分配的标志,即它已被过度释放或保留。

我在我的一个项目中遇到了与UIImagePickerController相同的问题。

僵尸是研究自动释放问题的好方法。要在Xcode 4.1或4.2中打开Zombies,“Run”阶段的“Diagnostics”选项卡上会出现一个名为“Enable Zombie Objects”的复选框。

启用Zombies时,您应该在之前访问EXEC_BAD_ACCESS的控制台中获得异常。此异常将告诉您有关该对象的信息。

答案 1 :(得分:1)

我发现了问题,我将该类设置为其他东西的委托,当我在dealloc方法中将委托设置为nil时问题得到了解决。这在iOS4中完全被忽略了,但似乎iOS5对这些东西更敏感。谢谢你的帮助!