将ARC与非ARC混合会生成EXC_BAD_ACCESS。怎么修?

时间:2012-10-02 18:46:27

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

我正在将我的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];
}

当我运行仪器时,我发现这是原因:

Instrument image 1

Instrument image 2

所以,从图像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

1 个答案:

答案 0 :(得分:0)

如果要将项目转换为ARC,则应在所有 代码上启用ARC。 Xcode会在您执行调用autoreleaseretainrelease等所有地方时出错。只需构建,修复错误,构建,修复错误......重复直到它成功构建。对于您正在使用的任何第三方代码,您应该禁用ARC。对于您引用的任何第三方编译库,您应该能够正常使用它们。

有关转换的详情,请参阅here