3

私はついに、オブジェクトを解放する必要があるかどうか、そして些細なアプリケーションで保持カウントをできるだけ低く保つ方法を理解しました(オブジェクトがすでに呼び出された追加の「保持」で戻ってくるかどうかを知ることによって)。したがって、NARCルールはその点でかなりうまく機能しています。

一方、retain(通常は保持プロパティを使用して)assignインスタンス変数を使用するかどうかに頭を悩ませることはできません。そこに経験則はありますか?私は2つしか知りません:

  1. クラス内(たとえば、init)でインスタンスを作成した場合は、インスタンスを保持して、で解放する必要がありdeallocます。
  2. 代表者は割り当てられますが、保持されません

しかし、私が理解していないのは、別のインスタンスから渡したものを保持する必要があるかどうかです。保持カウントがゼロになり、バッグを保持したままにする(または多くの余分なバッグとメモリを保持したままにする)リスクがあることは知っていますが、これが起こらないようにアプリケーションをどのように整理する必要がありますか?

私はいくつかの関連する質問を見ましたが、一般的なものは何もありません。

私がここにいる間:に追加されたもの、UIWindowまたはUIView私が個人的に保持していないものはどうですか?それらのスーパービューがすべてのスーパービューから削除された場合、「自然に」保持されたインスタンスの割り当てが解除されますか?

4

2 に答える 2

10

次のようなクラスタイプのオブジェクトの場合:

  • retainデフォルトごと
  • copyクラスが可変/不変のクラスクラスターからのものである場合
  • assign弱参照が必要な場合

クリーンアップに関しては、すべてretaincopyプロパティがである必要がありますreleased

クラス内(たとえば、init内)でインスタンスを作成した場合は、インスタンスを保持して、deallocでリリースする必要があります。

問題は、それがクラスのメソッドで作成されたかどうかではなく、次のことです。

  • インスタンスへの強力な参照が必要
  • すでに所有しています

まだ所有しておらず、それへの強力な参照が必要な場合は、保持してください。これは、メソッドに渡されるインスタンスにも当てはまります。セッターを介して明示的に保持するか暗黙的に保持するかは重要ではありません。

于 2010-07-18T21:31:26.650 に答える
2

保持カウントを可能な限り低く保つ方法

わかりません。保持カウントについて心配する必要があると思う理由は何ですか?保持カウントは実装の詳細です。忘れてください。心配する必要があるのは、オブジェクトを所有しているかどうかだけです。

保持するか(通常は保持プロパティを使用して)、インスタンス変数を割り当てるだけか、頭を悩ませることはできません。

ほとんどの場合、インスタンス変数を割り当てるときに保持またはコピーする必要があります。主な例外は保持サイクルです。オブジェクトAがオブジェクトBを参照し、オブジェクトBがオブジェクトAを参照している状況に陥ることがあります。AがBを保持し、BがAを保持している場合、deallocで参照を解放する通常のパターンに依存して作成することはできません。彼らは去ります。この状況では、通常、一方のオブジェクトを所有者として指定し、もう一方のオブジェクトを所有者として指定します。その場合、所有されているオブジェクトは、所有者への参照を保持しません。

この例は、親ノードがその子への参照を持ち、各子がその親への参照を持っているツリー構造です。各子が親を保持している場合、アプリケーションが親で行われると、すべての子によって保持されているため、子は消えません。したがって、親参照は弱参照として実装されます。これは、子がその親を保持しないことを意味します。

オブジェクトの所有者が自分自身をオブジェクトのデリゲートとして設定するのは、デリゲートの非常に一般的なパターンです。たとえば、テーブルビューのコントローラーは、多くの場合、テーブルビューのデータソースおよび/またはデリゲートでもあります。テーブルビューがデリゲートを保持している場合は、保持サイクルがあります(コントローラーがすでにビューを保持しているため)。これが、「委任は保持されない」という慣習が生まれた理由です。

参照先のオブジェクトがNSCopyingを実装していて、所有権を持っている間は変更しないようにする必要がある場合は、必ずコピーする必要があります。Cocoaの例は、NSDictionaryの要素のキーです。辞書にある間にキーが変更された場合、それは惨事になります。したがって、NSDictionaryはそのキーをコピーします。

保持カウントがゼロになり、バッグを保持したままにする(または多くの余分なバッグとメモリを保持したままにする)リスクがあることは知っていますが、これが起こらないようにアプリケーションをどのように整理する必要がありますか?

シンプル:Cocoaのメモリ管理ルールに従います。あなたがそれへの参照を保持している間に何かが消えた場合、あなたはその何かを所有していませんでした。現在の方法の範囲よりも長くぶらぶらする必要がある場合は、それを保持する必要があります。

于 2010-07-19T08:18:46.200 に答える