iPhone開発-向きを変更するとアプリケーションがクラッシュする

StackOverflow https://stackoverflow.com/questions/475911

  •  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をリリースするタイミングを正確に把握する必要があります(終了時に適切に)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top