我在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被禁用,那么诸如发布之类的调用应该没问题吗?
答案 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对这些东西更敏感。谢谢你的帮助!