2011-03-03 14 views
16

iOSデベロッパーの場合、デリゲートはほぼすべての場所で使用されます。デリゲートの "assign"と "retain"

そして、我々はその理由は、私は多くのコードを見て、円形のループ問題にWhy are Objective-C delegates usually given the property assign instead of retain?

を避けるためです「を割り当てる」の代わりに、この

のようなデリゲートのための保持に使用する必要があることのように思えます彼らはまだ「保持」を使用していました。したがって、ここでの質問は、代理人にretainを使用すると、循環ループの問題が発生するかどうかです。

おかげ

答えて

26

documentationは言う:オブジェクトを保持

は強い参照を作成し、その強参照の全てが解放されるまでオブジェクトが割り当て解除することはできません。 2つのオブジェクトがお互いを保持している場合、それらの間の接続は、例として

を分けることができないため、どちらのオブジェクトは、これまで割り当て解除されます、のはUITableViewDelegateプロトコルを実装のUITableViewControllerを考えてみましょう。 UITableViewはビューコントローラによって保持されますが、UITableViewはデリゲートを保持しません。

上記のように、UITableViewControllerはすべての強力な参照が解放されると、その解放を完了します。 UItableViewControllerをデリゲートとして持つUITableViewはそれを保持しないため、UItableViewControllerの所有者がreleaseを呼び出したときに保持カウントはゼロになり、deallocメソッドが呼び出されます。

ここで、UITableViewがそのデリゲートを保持しているとします。 UITableViewControllerの保持カウントは少なくとも+2になります。 1つはオーナーで、もう1つはUITableViewです。 UITableViewControllerの所有者が解放を呼び出すと、保持カウントは+1になり、期待通りにゼロにならないので、保持カウントがゼロになるまでdeallocメソッドが呼び出されません。ゼロに達するには、UITableViewControllerは、そのデリゲート(UITableViewController)を解放するUITableViewを解放する必要があります。保持カウントが+1にならないので、この瞬間を解放することは決して起こらないので、UITableViewControllerはそのビュー(UITableView)のみを破棄するためです。

(メモリの警告やその他の可能性のあるケースは考慮しません...この例ではViewController/Viewが最適なオプションではありませんが、あまりにも多くの書き込みをしました:))

それは意味がありますか?

+0

はい、すごく感謝してありがとう!あなたのケースでは、AはUITableViewController、BはTableViewなので、唯一の適切な方法はTableViewの代理人に代入を使用することです。 AはViewController、Bは別のViewController、Aは新しいBを作成し、Bの代理人は「retain」を使用し、AはBを解放することができます。この場合、「retain」は大丈夫ですそれは理にかなっていますか? – Forrest

+0

それを入手できませんでした。 AはBを作成し、Aは何かの代理人としてBを使用すると言うので、A.viewController(retain)= B、A.delegate(assign)= Bです。あるいは、AはBの代理人です。 viewController(retain)= B、およびB.delegate(assign)= A?どちらが当てはまるのですか? – vfn

+0

AとBについてのコンテキストはリンケージから来ているObjective-C代理人には、通常retainの代わりにプロパティの割り当てが与えられているのはなぜですか? – Forrest

関連する問題