xcode をアップグレードし、iOS 6 SDK を使用してアプリをコンパイルした後、アプリで多くのクラッシュが発生しました。私が追跡できたものから、モーダルセグエ中にUIKitメッセージがビューコントローラーの割り当てを解除したようです。新しく作成されたものではありません。外観は次のとおりです。
Navigation Controller を表示する Tabbar Controller があります。Navigation Controller によって提示されている別の View Controller は、Modal View Controller を表示します。
TabbarController --> NavigationController --> ViewController (提示) -- | モーダルセグエの使用を示しています | --> ViewController (表示)
クラッシュを引き起こす手順:
- 上記の階層で View Controller (提示) にアクセスします。ルート ビュー cntrl ではありませんが、それ以上です。
- モーダル ビュー コントローラーへのセグエをトリガーします。
- タブ バー (いずれか) からタブを選択し、同じ View Controller (表示中) に戻ります。タブを選択すると、Navigation Controller で popToRoot が呼び出されます。
- View Controllerへのモーダルセグエを再度トリガーします(提示)
- クラッシュ: ゾンビ オブジェクト - ビュー コントローラー (表示) - メッセージが表示されました
なんで?popToRoot が呼び出され、ビュー コントローラー (提示) がクリーンアップされ、モーダル ビューも破棄されたとき、以前の iOS のように見えます。そのため、再度アクセスすると、再作成されて提示されました。iOS 6 では、Allocations Instrumentation が示すものから、モーダル ビューがビュー コントローラー (提示) と共に破棄されます。しかし、何らかの理由でアクセスされると、UIKit は新しい modav ビュー コントローラーを作成しますが、もう存在しない古いものにメッセージを送信します。意味がありません。
私が不思議に思うもう 1 つのことは、iOS 5 の Allocations Instrumentation ツールでは保持カウント = 0 の View Controller (表示されている) が表示されないが、iOS 6 では表示される (その後 -1 になる) ことです。
これはおそらく私を助けるのが非常に難しい質問であることはわかっていますが、おそらく誰かがすでに iOS 6 やそのようなセグエの問題に取り組んでいるでしょうか?
Allocations Instrumentation ツールから、iOS 6 でのセグエの実装で多くのことが変更されたことがわかります。