1

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

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

仪器图像 1

仪器图像 2

所以,从图 2 中,我看到该版本来自“main.m”???我假设它与 main.m 中的自动释放池有关。因此,我在转换为 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 并显示消息“线程 1:信号 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
4

1 回答 1

0

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

有关过渡的更多信息,请参见此处

于 2012-10-02T19:02:39.873 回答