设置窗口根视图控制器没有堆栈跟踪的错误访问

时间:2013-01-02 16:36:14

标签: objective-c ios uiviewcontroller automatic-ref-counting

编辑:这似乎是我的一个愚蠢的错误,在我处理它之前,我得到了一个轮换更改通知。这引起了连锁反应,导致一些不起眼的位置发生碰撞。让我看看我如何关闭/删除这个问题......

我的应用程序已经运行了一段时间,但我今天决定最终“正确”实现它,即:使用视图控制器而不是手动将单个视图添加到UIWindow。这一段时间非常流畅,直到我尝试将window.rootViewController设置为我的视图控制器。

在applicationDidFinishLaunchingWithOptions之后的某个地方,它以糟糕的访问权限崩溃。没有有用的堆栈跟踪(它在程序集中崩溃),我无法看到它回到我的代码任何地方(我将日志放在整个地方)。只需将viewcontroller的视图添加到主窗口就可以正常工作。这是代码的一部分:

-(BOOL) application:(UIApplication *)app didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ....
    self.window = [[UIWindow alloc] initWithFrame: [UIScreen mainScreen].bounds];
    self.viewController = [[MainViewController alloc]init];
    // if i uncomment this it crashes:
    // self.window.rootViewController = self.viewController;
    [self.window addSubview: viewController.view]; // Commented out if i use the rootViewController

    [self.window makeKeyAndVisible];
    NSLog(@"Did finish launching");
    return YES;
}

我已经尝试了一些调试方法(堆栈跟踪不存在,手动单步执行代码,在崩溃前没有调用日志),但我找不到问题。它在libobjc.A.dylib'objc_retain:中崩溃,而堆栈跟踪中唯一的另一件事是objc_storeStrong。这不是保留/释放问题(至少不是直接),因为我正在使用ARC。调用最终的NSLog,如果我手动完成,它将退出didFinishLaunching。

我可以在不设置根视图控制器的情况下使应用程序正常工作,但重做这一部分的重点是做一切“正确”(例如,在没有根视图控制器的情况下,旋转必须相对hackish。)

所以StackOverflow,请告诉我你有一些想法!因为这让我发疯:S

2 个答案:

答案 0 :(得分:0)

您不需要这样做:

[self.window addSubview: viewController.view];

当您将视图控制器设置为根视图控制器时,它的视图已成为窗口的子视图。

编辑

然而,这不会造成任何问题。

可能问题不在代码中。有时我的应用程序崩溃了,我生气了。通常会发生这种情况,因为我从另一个文件夹拖动项目,xcode发现有权限的问题,或者其他一些(对我来说)未知的原因。

尝试使用alt + cmd + k清理项目。如果这不起作用,您可能会遇到权限问题。因此,创建另一个项目并复制您写入的所有文件。

答案 1 :(得分:0)

这似乎是我的一个愚蠢的错误,在我处理它之前,我得到了一个rotationChanged通知太早。这引起了连锁反应,导致一些不起眼的位置发生碰撞。无论如何,谢谢你的帮助!