2011-05-24 9 views
1

私はプログラミングに新しく、ObjCとCocoaTouch Frameworkを学び始めました。 私は委任パターンについて学びましたが、私はそれを使うのがかなり快適ですが、多分それを使いすぎているかもしれません。デリゲートパターンとUIKitビューコントローラ、-viewDidUnloadについて

私が理解していないことが1つあります。それはUIKitビューコントローラ固有のものですが、私は多くの投稿を読んだことがありますが、明確な答えは見つかりません。
Memory management with delegates?
Why are Objective-C delegates usually given the property assign instead of retain?
スタック内の非可視コントローラ(割り当てる保持しない)は、可視コントローラはデリゲートとして持っていることを想像し、の私はナビゲーションコントローラを持っていると私はそれを介してビューコントローラをプッシュしていたとしましょう。メモリ警告が受信され、viewDidUnloadおよびdeallocメソッドを使用してすべてのView Controller(表示されているものを除く)がアンロードされると、デリゲートはアンロードされ、 "コールバック"は送信されません。
新しいビューコントローラがプッシュされていないがモーダルで表示されている場合、デリゲートとビューコントローラ間の "接続"が失われることはなく、viewDidUnloadは親ビューで呼び出されません。

私の質問です:
2つのView Controller間で委譲パターンを使用するのは間違いありませんか?

答えて

2

コントローラのセマンティクスによっては、確かに正しいデザインです。私は、「スレーブ」ビューコントローラから「マスター」ビューコントローラを管理(およびデリゲートコールを受け取る)するときにこれを使用しました。メモリの警告が送信された場合に何が起こるかのあなたの分析に関しては

は、ビューコントローラが実際に viewDidUnload受信しますが、これが意味することは、それによって制御 viewがアンロードされたことがあるという点で、おそらく若干の誤解がありますいくつかのメモリを取り戻すために、コントローラは(通常どおり)クリーニングの部分を行うことができます。ビューコントローラ自体は「アンロード」されていません。したがってコールバックは常に送信されます。唯一のことは、ビューが以前にアンロードされていた場合は、ビューを元に戻す必要があることです。あなたがアンロードビューを再作成するのは全く不可能である場合、また、心の中で

キープは、あなたががあなたのdidReceiveMemoryWarningオーバーライドでsuperを呼び出していないことで解放されることから、特定のビューを防ぐことができます。しかし、この提案を "cum granum salis"としましょう!

最後に、モーダルビューを使用する必要はありません。

確かに、これは言うApple Docsです:

  • (無効)didReceiveMemoryWarning:このメソッドチェックの デフォルトの実装ビューコントローラは、安全にそのビューを解放することができるかどうかを確認します。これは、ビュー自体にスーパービューがなく、nibファイルかカスタムloadViewメソッドを使用して再ロードできる場合に可能です。ビューを解放できる場合、このメソッドはそれを解放し、viewDidUnloadメソッドを呼び出します。

  • (void)viewDidUnload: このメソッドは、viewDidLoadメソッドの対応するものとして呼び出されます。メモリが解放されるように、ビューコントローラがそのビューおよびそのビューに関連付けられたオブジェクトを解放する必要があるときに、メモリ不足の状態で呼び出されます。ビュー・コントローラは、ビューや他のビュー関連オブジェクトへの参照を格納することが多いため、このメソッドを使用してそれらのオブジェクトの所有権を解放し、それらのオブジェクトのメモリを再利用する必要があります。これは、後でviewDidLoadメソッドまたはアプリケーションの他の部分から簡単に再作成できるオブジェクトに対してのみ行う必要があります。このメソッドを使用して、ユーザーデータや簡単に再作成できないその他の情報を解放しないでください。

+0

よりも優れている...と光のunderstood..finally少しありがとうVCそのもの。どうもありがとうございます!!!!! – Andrea

0

あなたのUIViewControllerはかなり軽量であり、低メモリ状態では絶対にアンロードしないでください。ビューコントローラが所有するUIViewは非常に重量があり、低メモリ状態では必ずアンロードされます。必要に応じてコントローラがビューを再作成する準備ができている必要がありますが、ビューコントローラのスタックを再生成する必要はありません。

+0

それはない取り除かれるだけでVCが所有するビューです;-)あまりにモルガン・2人の声が1 :-)私が見 – Andrea