iPhone開発-向きを変更するとアプリケーションがクラッシュする
-
19-08-2019 - |
質問
アプリケーションでEXC_BAD_ACCESS
エラーが発生し、スタック/停止するこの問題にぶつかります。 <!> quot; Rotate Left <!> quot;を使用しています。 <!> amp; <!> quot;右回転<!> quot;方向変更動作をシミュレートするシミュレータのオプション。このエラーの考えられる理由は何ですか?エラーの詳細がわからないため、トレースできません。
すべてのコントローラークラスには次のものがあります:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationPortrait); // Return YES for supported orientations
}
アイデア、ポインター?ありがとう。
しかし、私のコードには[UIDevice setOrientation:]メソッドの呼び出しがありません。
これはデバッグウィンドウに表示されるトレースです。
objc_msgSend
-[UIWindow _handleDeviceOrientationChange:]
_nsnote_callback
__CFXNotificationPost
_CFXNotificationPostNotification
-[NSNotificationCenter postNotificationName:object:userInfo:]
-[UIDevice setOrientation:]
-[UIApplication handleEvent:withNewEvent:]
_[UIApplication sendEvent:]
_UIApplicationHandleEvent
SendEvent
PurpleEventTimerCallBack
CFRunLoopRunSpecific
CFRunLookRunInMode
GSEventRunModel
GSEventRun
-[UIApplication _run]
UIApplicationMain
main
ビューにタブバーが含まれている場合、エラーが表示されることに注意してください。誰も返信していないので、これは一般的な問題ではなく、この問題に対処しているリソースは見つかりません。
どういうわけか、アプリケーションを単一の方向(ポートレート)で実行するように指示できますか?また、方向の変更のイベントを送信しませんか?これは私の問題を解決するかもしれませんが、これは私が探している代替案です。
Paulに感謝します。コメントは役に立ちました。問題を修正できましたが、不要なビューのメモリを保持するコストがかかりました。何が起こっているのですか:
別のビュー(ビューB)を開くビュー(ビューA)があります。 App Delegateメソッドは、View AとView Bの両方を開く役割を果たします。ViewAでアプリケーションがクラッシュすることはありません。ViewAをウィンドウから削除し、コントローラーオブジェクトを解放して、View Bをウィンドウに追加します。これは私が何か間違ったことをしているところだと思います。コードを手伝ってくれませんか?
ビューAを解放し、ビューBを開くためのコードは次のとおりです。
- (void)openViewB {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.0];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES];
// Remove viewControllerA from the window's view
[window removeFromSuperview];
// !-- Commenting out this block fixes the issue --!
// Release memory wired for viewControllerA view
if(viewControllerA) {
[viewControllerA release];
viewControllerA = nil;
}
// We call window:addSubView to add the viewB to the main window.
// You can use this call to add other views as child views not only to windows
// but to other views as well. (UIWindow is a subclass of UIView).
[window addSubview:viewControllerB.view];
[UIView commitAnimations];
// Override point for customization after application launch
[window makeKeyAndVisible];
}
タブバーアプリケーションテンプレートを使用してアプリケーションを起動しましたが、viewControllerB
のタイプはUITabBarController
です。ここで間違いを犯しています。ポインターはありますか?
解決
設定が正しくないためにシステムライブラリコードでクラッシュすることは珍しくありません。これは、UIWindowまたはそのコンテンツビューまたはView Controllerインスタンスが保持されていないか、何らかの理由でリリースされた可能性があります。
コントローラーがまだ存在していない場合、このRotateメソッドは役に立ちません。
rpetrichの提案は、どのオブジェクトがリリースされたかを特定するのにまだ有用かもしれません。
特に厄介な問題については、release、retain、およびdeallocメソッド(superをログに記録して呼び出す)を疑わしいクラスに追加して、何がリリースされているかを確認できます。 -retaincountを記録して追跡します(これは診断目的でのみ使用し、出荷アプリでのメモリ管理は行いません)。
他のヒント
-[UIDevice setOrientation:]
にブレークポイントを設定し、デバッガーでコードをステップ実行します。
デバッグを容易にするために、デバッガコンソールでcall (void)instrumentObjcMessageSends(YES)
と直接入力してobjc_msgSend
sを/ tmp /に記録し、次にcontinue
実行すると、送信されるすべてのメッセージをトレースします。クラッシュ。
私も同じ問題に直面しました。ViewControllerが[ViewController release]を使用してリリースされた場合でもビューを使用し、その時までにアプリケーションの向きを変更するとクラッシュします。
viewcontrollerをリリースするタイミングを正確に把握する必要があります(終了時に適切に)。