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が最適なオプションではありませんが、あまりにも多くの書き込みをしました:))
それは意味がありますか?
出典
2011-03-03 03:45:18
vfn
はい、すごく感謝してありがとう!あなたのケースでは、AはUITableViewController、BはTableViewなので、唯一の適切な方法はTableViewの代理人に代入を使用することです。 AはViewController、Bは別のViewController、Aは新しいBを作成し、Bの代理人は「retain」を使用し、AはBを解放することができます。この場合、「retain」は大丈夫ですそれは理にかなっていますか? – Forrest
それを入手できませんでした。 AはBを作成し、Aは何かの代理人としてBを使用すると言うので、A.viewController(retain)= B、A.delegate(assign)= Bです。あるいは、AはBの代理人です。 viewController(retain)= B、およびB.delegate(assign)= A?どちらが当てはまるのですか? – vfn
AとBについてのコンテキストはリンケージから来ているObjective-C代理人には、通常retainの代わりにプロパティの割り当てが与えられているのはなぜですか? – Forrest