2

EXC_BAD_ACCESSアプリケーションでエラーが発生し、スタック/停止するこの問題にぶつかっています。シミュレーターの「左に回転」と「右に回転」オプションを使用して、向きの変化の動作をシミュレートしています。このエラーの考えられる理由は何ですか? エラーの詳細がわからないため、追跡できません。

私のすべてのコントローラークラスには次のものがあります。

- (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

ビューにタブ バーが含まれているとエラーが表示されることに注意してください。誰も返信していないので、これは一般的な問題ではないと思います。この問題に対処するリソースが見つかりません。

どういうわけか、アプリケーションを単一の向き (縦向き) で実行するように指示し、向き変更のイベントを送信しないようにすることはできますか? これは私の問題を解決するかもしれませんが、これは私が探している代替手段です。


ありがとうポール、あなたのコメントは役に立ちました。問題を修正することができましたが、必要のないビューのメモリを保持するコストがかかりました。何が起こっているかは次のとおりです。

別のビュー (ビュー B) を開くビュー (ビュー A) があります。App Delegate メソッドは、ビュー A とビュー B の両方を開く責任があります。アプリケーションはビュー A でクラッシュしません。ウィンドウからビュー A を削除し、そのコントローラー オブジェクトを解放し、ビュー 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. 私は間違いなくここで何か間違ったことをしています。ポインタはありますか?

4

3 に答える 3

2

正しく設定されていないことが原因で、システムライブラリコードがクラッシュすることは珍しくありません。これは、UIWindowまたはそのコンテンツビューまたはView Controllerインスタンスが保持されていないか、何らかの理由で解放されていない可能性があります。

コントローラがまだ存在しない場合、そのshouldrotateメソッドは役に立ちません。

rpetrichの提案は、どのオブジェクトがリリースされたかを識別するのに役立つ場合があります。

特に厄介な問題の場合は、リリース、保持、およびdeallocメソッド(ログに記録してsuperを呼び出す)を疑わしいクラスのクラスに追加し、何がリリースされているかを確認できます。追跡するために-retaincountをログに記録します(これは診断目的でのみ使用し、出荷アプリでメモリ管理を行うためではありません)。

于 2009-01-26T19:02:55.290 に答える
1

ブレークポイントを設定-[UIDevice setOrientation:]し、デバッガーでコードをステップ実行します。

デバッグを容易にするためcall (void)instrumentObjcMessageSends(YES)に、デバッガ コンソールに直接入力してobjc_msgSends を /tmp/ に記録し、continue実行すると、送信されたすべてのメッセージがクラッシュまでトレースされます。

于 2009-01-25T00:14:34.110 に答える
0

私も同じ問題に直面しました。[ViewController release]を使用してviewcontrollerが解放されたが、まだビューを使用している場合、その時までに方向を変更するとアプリケーションがクラッシュすると思います。

ビューコントローラーをいつ解放する必要があるかを正確に把握する必要があります[おそらく終了時に]。

于 2009-06-01T07:01:53.057 に答える