次のシナリオがあります。
UIViewControllerA は、ストーリーボード セグエを介して UIViewControllerB をナビゲーション スタックにプッシュします。
UIViewControllerB は現在画面上にあり、iOS シミュレーターを介してメモリ警告をシミュレートします。
UIViewControllerA.DidReceiveMemoryWarning() は、UIViewControllerA.ViewDidUnload() と同様に呼び出されます。
メソッド UIViewControllerA.ViewDidUnload() で、推奨どおり ReleaseDesignerOutlets() を呼び出します。UIViewControllerA デザイナー アウトレットが割り当て解除され、null になりました。
ナビゲーション バーの「戻る」ボタンを押すと、UIViewControllerB が閉じられ、UIViewControllerA.ViewDidLoad() が呼び出されます。
この時点で、デザイナー アウトレットが初期化されることを期待しますが、それらはまだ nullであり、null ポインター例外が原因でアプリケーションがクラッシュします。
私は根本的に何かを見逃していますか?Monotouch 5.4.0 を使用しています。
編集問題の解決策を説明しているこの投稿が、私が発見したものと同じであることがわかりました。つまり、ViewDidUnload() でデザイナー アウトレットを解放しないでください。
更新: ついにクラッシュフリーになりました! (または少なくともそう思われる)
今後の参考のために、大きなロックアップはViewDidUnload イベントで UIWebView アウトレットを処分したことが原因だったようです。UIWebView は xib で定義され、コードでサブビューとして追加されません。
メモリが少なくなると、ビューがアンロードされ、UIWebView アウトレットが削除されました。その後、アプリが回復すると (!?)、ViewDidLoad イベントが再び発生しますが、ロックアップします。ビューがリロードされたとき(つまり、xib がリロードされたとき)に UIWebView が復元されることを期待していました。
そうではありませんか?ViewDidUnload イベントでアウトレットを処分するのは良い習慣だと思いましたか?
「webView.Dispose(); webView = null;」をコメントアウトするとすぐに コード行、期待どおりに動作しています。
なんて日だ!
編集さらにデバッグすると、UIImageView や UIScrollView などの一部のデザイナー アウトレットが再割り当てされていることがわかりますが、UITextField や UIBarButtonItem などの他のアウトレットはそうではありません。