我正在将我的iOS4项目转换为ARC。我正在使用一些外部库,如PTPasscodeViewController,AppPirater,Flurry。我一直到达EXC_BAD_ACCESS,这意味着我向一个解除分配的对象发送一条消息。我使用Instruments跟踪它但无法弄清楚如何解决它。我希望SO的某些人能指出我正确的方向。
我的SettingsViewController编译时没有ARC(-fno-obj-arc)。它在我的主根视图控制器中初始化,名为IouViewController:
-(void)showSettings:(id)sender {
SettingsViewController *infoView = [[SettingsViewController alloc] init];
[infoView setIouArray:iouTableArray];
[[self navigationController] pushViewController:infoView animated:YES];
}
当我运行仪器时,我发现这是原因:
所以,从图像2,我看到发布来自'main.m'???我假设它与main.m中的autorelease池有关。因此,当我转换为ARC时,我所犯的一个'错误'就是我将main.m更改为与启用ARC的新项目相同。我不确定这是否有任何不同,但我有其他EXC_BAD_ACCESS问题,并且这样做可以使它工作。
供参考,这是我的main.m:
int main(int argc, char *argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([IouApp2AppDelegate class]));
}
}
作为附加说明,当它崩溃时,它会跳转到main.m并显示消息“Thread 1:signal SIGKILL”。
我不知道没有SO我会怎么做。感谢社区的所有帮助。
更新1:如果我尝试将ARC用于SettingsViewController,我会遇到一些错误,我不太愿意处理它。这是一个例子:
// passcode is correct, direct to PasscodeSettingsViewController
// self retain, autorelease might be needed so that you do not look access to where the navigationController is since we pop one
[[self retain] autorelease];
// if you set popViewControllerAnimated:YES, weird title things happen. DO NOT MESS!!!
[[self navigationController] popViewControllerAnimated:NO];
此代码段来自PTPasscodeViewController示例代码库。使用ARC,它给了我错误:
[rewriter] it is not safe to remove an unused 'autorelease' message; its receiver may be destroyed immediately
答案 0 :(得分:0)
如果要将项目转换为ARC,则应在所有 代码上启用ARC。 Xcode会在您执行调用autorelease
,retain
和release
等所有地方时出错。只需构建,修复错误,构建,修复错误......重复直到它成功构建。对于您正在使用的任何第三方代码,您应该禁用ARC。对于您引用的任何第三方编译库,您应该能够正常使用它们。
有关转换的详情,请参阅here。