あなたの理解は逆です。弱い参照は、子から親への関係を実装するためによく使用されます。親子関係ではほとんど意味がありません。通常、親は子を所有します。つまり強い。
ほとんどの場合、強力なリファレンスが必要です。これがデフォルトの理由です。強い参照を持たない最も一般的な理由は、保持ループが発生するかどうかです。たとえば、A が B への強い参照を持っている場合、B が A への強い参照を持っている場合、ループが発生し、どちらのオブジェクトも割り当て解除されません。そのため、オブジェクトの 1 つを所有者として選択すると、そのオブジェクトは強い参照を持ちます。もう一方のオブジェクトには弱い参照があります。
これの最も一般的なケースは委任です。デリゲートは、ほとんどの場合、デリゲート対象のものを所有します。そのため、委任オブジェクトはデリゲートへの弱い参照を持つ必要があります。Objective-C の規則として、呼び出されたプロパティdelegate
は弱いと見なされます。(これが後ろ向きに感じられる場合は、実際にどのように使用UITableView
しUITableViewDelegate
、どちらを「所有者」と見なすかを考えてください。)
弱いデリゲート ポインターは厳格なルールではありません。などの例外がありますNSURLConnection
。委譲オブジェクトの有効期間がデリゲートよりも短い場合、強い参照を維持することは問題ありません (一般的には望ましいことです)。
「Received Memory Warning」は、必ずしもメモリ管理とは関係ありません。それは、メモリを使いすぎていることを意味します。保持ループがある場合は、メモリ リークが発生している可能性があり、この警告が発生する可能性があります。しかし、単にメモリを使いすぎていることが原因である可能性もあります。Instruments の「割り当て」ツールは、これを調査するための最良の方法です。
"strong" と "weak" の実装は、Objective-C にごく最近追加されたものですが、適切に記述されたコードが長年にわたって手動保持で行ってきたことを形式化し、より優れた言語サポートを提供するだけです。現在の所有パターンは、ARC 以前と同じです。