编辑:这似乎是我的一个愚蠢的错误,在我处理它之前,我太早收到了一个 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