0

编辑:这似乎是我的一个愚蠢的错误,在我处理它之前,我太早收到了一个 rotationChanged 通知。这引起了连锁反应,导致在一些不为人知的位置坠毁。让我看看如何关闭/删除这个问题......

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

在 applicationDidFinishLaunchingWithOptions 之后的某个地方,它因访问错误而崩溃。没有有用的堆栈跟踪(它在程序集中崩溃),而且我看不到它在任何地方重新回到我的代码中(我将日志放在所有地方)。只需将视图控制器的视图添加到主窗口即可。这是代码的一部分:

-(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;
}

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

我可以在不设置根视图控制器的情况下使应用程序正常工作,但重做这部分的全部目的是“正确”地做所有事情(例如,在没有根视图控制器的情况下,旋转必须相对粗俗地完成)。

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

4

2 回答 2

0

看来这是我的一个愚蠢的错误,在我处理它之前,我太早收到了一个 rotationChanged 通知。这引起了连锁反应,导致在一些不为人知的位置坠毁。无论如何感谢您的帮助!

于 2013-01-02T17:15:24.430 回答
0

你不需要这样做:

[self.window addSubview: viewController.view];

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

编辑

但是,这不会造成任何问题。

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

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

于 2013-01-02T16:41:58.780 回答