編集:これは私にとって愚かな間違いだったようです。処理する前に、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;
}
私はかなりのデバッグ方法を試しましたが(スタックトレースが存在せず、コードを手動でステップ実行するのに時間がかかり、クラッシュする前にログが呼び出されません)、問題を見つけることができません。でクラッシュしlibobjc.A.dylib'objc_retain:
、スタックトレースの他の唯一のものはですobjc_storeStrong
。私はARCを使用しているので、(少なくとも直接ではなく)保持/解放の問題ではありません。最終的なNSLogが呼び出され、手動でステップスルーすると、didFinishLaunchingから抜け出します。
ルートビューコントローラーを設定しなくてもアプリを動作させることができますが、この部分をやり直すことの全体的なポイントは、すべてを「適切に」実行することでした(たとえば、ルートビューコントローラーなしで回転を比較的ハックする必要があります)。
StackOverflow、アイデアがあることを教えてください!これが私を夢中にさせているので:S