0

ipad と iphone UI の両方の NIB ファイルを含むユニバーサル アプリケーションを作成しました。ビュー コントローラーの initWithNibName メソッドでUIUserInterfaceIdiomPad == UI_USER_INTERFACE_IDIOM()、コントローラーが iPhone または iPad で実行されているかどうかを検出するために呼び出します。

次に、それぞれの nib ファイルを起動します。iPhoneでアプリを実行すると問題なく動作しますが、iPadで実行すると最終的にEXC_BAD_ACCESSエラーでクラッシュします。このエラーは、View Controller を使用して別の View Controller を起動し、その後別の View Controller をナビゲーション スタックで起動すると発生します。このエラーは、スタックの 3 番目のコントローラーに属するビューをクリックするとすぐに発生します。

NIBクラッシュの原因となるファイルの違いを区別できません。なぜこれが起こっているのかを解明するために精力的に取り組んできましたが、このエラーを修正することはできません. 何が起こっているのかについての洞察を持っている人はいますか?

この問題を解決する方法についてアドバイスをいただければ幸いです。

4

1 に答える 1

2

最初にすべきことは、「すべての例外」ブレーク ポイントを有効にすることです。多くの場合、これにより、EXC_BAD_ACCESS が発生しているコード行が正確にわかります。

ここに画像の説明を入力

次に、ゾンビをオンにして、過剰リリースが発生している場所を確認します。これを行うには、Xcode でオプション キーを押しながら、[製品] | [製品] をクリックします。実行....次のウィンドウで、環境変数リストに NSZombieEnabled を追加します。

ここに画像の説明を入力

次に実行します。通常どおりにクラッシュを引き起こし、デバッガーがどこに到達するかを確認します。運が良ければ、問題が実際に発生している場所で停止します。

EXC_BAD_ACCESS を取得すると、既にリリースされているものにアクセス/リリースしようとしていることを意味します。ARC 以外の状況にある場合は、通常、意図していないときに不注意に何かをリリースしたことを意味するため、alloc/init と release balance を確認してください。ただし、ARC の状況にある場合は、View Controller が解放されたときにデリゲートを niling しないことに関係していると思います。

たとえば、MKMapView があり、そのデリゲートをビュー コントローラーに設定している場合、ビューがアンロードまたは解放されたときにそのデリゲートを nil する必要があります。そうしないと、メッセージは引き続きそれに設定されます。または、ビュー コントローラーを NSNotificationCenter オブザーバーとして追加し、ビュー コントローラーがアンロードまたは解放されたときにオブザーバーとして削除しなかった可能性もあります。

もう 1 つの可能性は、ユニバーサル アプリの 2 つのバージョン間でビュー コントローラーを再利用していることです。iPad の nib に存在しない識別子で何かにアクセスすると、クラッシュが発生しますが、ストーリーボードではなく nib を使用している場合は、問題にならない可能性があります。

今のところ思いつくのはこれくらいです。問題が発生している場所に焦点を合わせて、まだわからない場合はここにコードを投稿してください。

よろしくお願いします。

于 2012-06-05T20:03:09.883 に答える