2

強い/弱い参照に関する質問に目を通し、弱い参照 (親から子への関係) を使用する理由を理解しました。ただし、親子関係が作成される特定のシナリオについては混乱しています。

たとえば、UIView オブジェクトにサブビューを追加することは、親子関係を作成する例ですか? とは?

これまでのところ、プロジェクトのすべてをストロングを使用して行いましたが、ウィークを使用したことはありませんが、メモリ管理の問題が発生するかどうか (または発生するかどうかを確認する方法さえありません) はわかりません。

親から子への関係が作成される特定の状況または例を誰か提供できますか?

ありがとう!

編集:実際、多くのデータ (マップ ビュー、画像の数、テキスト、ボタン) を表示する ViewController の 1 つで、「Received Memory Warning」の問題が発生しています。すべてのプロパティには強いポインタがあります。このViewControllerのメモリ管理の問題を修正する必要があります

4

3 に答える 3

15

あなたの理解は逆です。弱い参照は、子から親への関係を実装するためによく使用されます。親子関係ではほとんど意味がありません。通常、親は子を所有します。つまり強い。

ほとんどの場合、強力なリファレンスが必要です。これがデフォルトの理由です。強い参照を持たない最も一般的な理由は、保持ループが発生するかどうかです。たとえば、A が B への強い参照を持っている場合、B が A への強い参照を持っている場合、ループが発生し、どちらのオブジェクトも割り当て解除されません。そのため、オブジェクトの 1 つを所有者として選択すると、そのオブジェクトは強い参照を持ちます。もう一方のオブジェクトには弱い参照があります。

これの最も一般的なケースは委任です。デリゲートは、ほとんどの場合、デリゲート対象のものを所有します。そのため、委任オブジェクトはデリゲートへの弱い参照を持つ必要があります。Objective-C の規則として、呼び出されたプロパティdelegateは弱いと見なされます。(これが後ろ向きに感じられる場合は、実際にどのように使用UITableViewUITableViewDelegate、どちらを「所有者」と見なすかを考えてください。)

弱いデリゲート ポインターは厳格なルールではありません。などの例外がありますNSURLConnection。委譲オブジェクトの有効期間がデリゲートよりも短い場合、強い参照を維持することは問題ありません (一般的には望ましいことです)。

「Received Memory Warning」は、必ずしもメモリ管理とは関係ありません。それは、メモリを使いすぎていることを意味します。保持ループがある場合は、メモリ リークが発生している可能性があり、この警告が発生する可能性があります。しかし、単にメモリを使いすぎていることが原因である可能性もあります。Instruments の「割り当て」ツールは、これを調査するための最良の方法です。

"strong" と "weak" の実装は、Objective-C にごく最近追加されたものですが、適切に記述されたコードが長年にわたって手動保持で行ってきたことを形式化し、より優れた言語サポートを提供するだけです。現在の所有パターンは、ARC 以前と同じです。

于 2012-07-12T19:03:31.500 に答える
3

一部の人々は、"Coding Together" Piazza クラスで弱い参照をいつ使用するかを説明する非常に役立つ図をまとめました。強い/弱いポインターを使用した基本的なメモリ管理を説明するいくつかの優れた図があります。

http://piazza-uploads.s3-website-us-east-1.amazonaws.com/attach/h3ex5vh7htrh9/h4777mrpwp17bg/h4777tczi147de/Views,%20Outlets,%20Weak%20References.pdf

于 2012-07-12T19:11:55.770 に答える
2

サブビューをビューに追加すると、親はそのサブビューをカバーの下に保持します。はい、これは親子関係です。独自の UIView サブクラスを作成している場合は、同じことを行います。

親は子供と強い関係を築いていますが、子供は親と強い関係を持つべきではありません。これにより、保持サイクルが発生する可能性があります。この場合、両者は互いに強いつながりがあるため、どちらも解放できません。

Strong がデフォルトです。デリゲート パターンを使用している場合は、weak を使用する傾向があります。

この質問はメモリのセマンティクスに関する非常に一般的なものであるため、受信したメモリ警告で発生している問題について、より具体的な情報を投稿する必要があるかもしれません。

于 2012-07-12T19:02:35.880 に答える