编辑:这似乎是我的一个愚蠢的错误,在我处理它之前,我得到了一个轮换更改通知。这引起了连锁反应,导致一些不起眼的位置发生碰撞。让我看看我如何关闭/删除这个问题......
我的应用程序已经运行了一段时间,但我今天决定最终“正确”实现它,即:使用视图控制器而不是手动将单个视图添加到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
答案 0 :(得分:0)
您不需要这样做:
[self.window addSubview: viewController.view];
当您将视图控制器设置为根视图控制器时,它的视图已成为窗口的子视图。
编辑
然而,这不会造成任何问题。
可能问题不在代码中。有时我的应用程序崩溃了,我生气了。通常会发生这种情况,因为我从另一个文件夹拖动项目,xcode发现有权限的问题,或者其他一些(对我来说)未知的原因。
尝试使用alt + cmd + k清理项目。如果这不起作用,您可能会遇到权限问题。因此,创建另一个项目并复制您写入的所有文件。
答案 1 :(得分:0)
这似乎是我的一个愚蠢的错误,在我处理它之前,我得到了一个rotationChanged通知太早。这引起了连锁反应,导致一些不起眼的位置发生碰撞。无论如何,谢谢你的帮助!