2012-01-12 16 views
4

私はUIViewControllerUINavigationControllerDelegateを使用する必要があります。具体的にはwillShowViewControllerメソッドを使用しています。UINavigationControllerDelagateを正しく割り当て/割り当てを解除する

私の実装で<UINavigationControllerDelegate>を設定していますが、代理人を自己に設定するのはviewDidLoadself.navigationController.delegate = self;)です。その後、私はwillShowViewControllerメソッドを実装し、正常に動作しますが、ビューコントローラがスタックからポップされると、メモリリークが発生し、アプリケーションがクラッシュします。私はviewDidUnloaddeallocの両方でself.navigationController.delegate = nil;を実行しようとしましたが、それは問題を解決しません。

私のビューコントローラの1つでこのデリゲートを実装する正しい方法は何ですか?

+0

エラーコードしてください! – CodaFi

答えて

6

viewDidUnloadは必ずしもこれまでと呼ばれ、時間deallocで(それは主にメモリ不足の状態を処理するためだ)と呼ばれることはありません、ビューコントローラは、おそらく、もはやナビゲーションコントローラに含まれているので、self.navigationControllernilをないだろう。

viewWillDisappear:の実装で代理人をnilに設定し、viewDidLoadではなくviewWillAppear:に設定することをおすすめします。

Btw、ここではメモリリークとは正反対です。メモリリークは、もう到達できないメモリであり、決して解放されません。ここでは、すでに解放されている(ビューコントローラ)メモリがありますが、(ダングリング)ポインタによって参照されているため、クラッシュします。本当のリークは、通常、クラッシュの直接的な結果にはなりません。

+3

'viewWillDisappear:'は別のView Controllerが* push *されているときにも送信されるので、実際にはそうでないかもしれないことに注意してください。 – Costique

+0

それは良い点です。 – omz

4

ナビゲーションコントローラーに弱い(保持しない)参照を保持するか、ナビゲーションコントローラーがコントローラーをポップすることが明らかになったときにその代理人をリセットする必要があります。真実は、deallocself.navigationControllerはすでにnilであり、コントローラがポップされたときにviewDidUnloadは送信されません。

0

あなたの[viewDidAppear:]実装で代理人を自分で設定し、代理人を[viewWillDisappear:]実装ではnilに設定する必要があります。

ヒント:deallocが呼び出されたときに、viewControllerがnavigationcontrollerスタックからポップされ、self.navigationControllerがnilでなければならないので、デリケートがdealloc実装でnilであると設定しないでください。

関連する問題