2012-01-05 19 views
1

対保持メンバーVARSを作るために、より良い習慣です、私はこのような「割り当て」と定義されている私のカスタムのUIViewControllerでメンバ変数を(「保持」ではない)持っています私は変数、例えばself.mSkipButtonを、変数型の自動解放されたallocに設定します。私はそれから私のコントローラのビューに本質的にビューの参照数を持ってそれを添付し、必要に応じてリリースします。はそれがアサイン

しかし、これは私のメンバーvarにポインタを格納しており、あるポイントでカウントが減少すると解放されたメモリを参照している可能性があります。代わりに変数を 'retain'として宣言し、次にviewDidUnloadメソッドでメンバーvarを解放するか、解放するにはnilに設定して、そこにアドレスがないことを確認するのがよいでしょうか?

また、viewDidUnloadのメンバーvarをnilに設定し、それを保持された変数にしないでください。

+0

このオブジェクトは、View Controllerより寿命の長い別のオブジェクトによって保持されますか?それが別のアイテム(おそらくアプリケーションデリゲート)によって保持されていることを証明できれば、それを保持していない可能性があります。しかし、ベストプラクティスでは、常に保持して解放する必要があると言います。 – Kekoa

答えて

2

が、代わりとして変数を宣言するために、より良い習慣です'保持'し、次にviewDidUnload ...?

はい、良い本能はretainです。 viewDidUnloadでは、通常、単にIVARのセッターを経由してnilに設定したい:self.ivar = nil;

は、私はそれが簡単に認識し、assignの使用に関連する問題に対処するよりも、明示的にオブジェクトcodependenciesを管理するために見つけます。管理されていない参照を保持するという問題を完全に回避することができます。

assignは通常はここで問題なく(場合によっては)assignを使用すると、そのクラスで作業しているすべての人にオブジェクトグラフと所有権が複雑になる可能性があります。プログラムの複雑さが増すにつれて(そして変更に依存するライブラリも)、管理されていない参照の存続期間を追跡することがますます困難になっています。異なるハードウェアとソフトウェアの組み合わせでは、状況が壊れたり、動作が異なる傾向があります。複雑なプログラムまたは並行コンテキストで管理されていないオブジェクトの存続期間を管理しようとすると、自己乱用になります。定義され、予測可能な動作/動作を保証することで、バグの数が減少します。

2

性のセマンティクスはそのプロパティが使用されようとしている方法に依存する(例えば変数またはIVARとしてObjective-Cで知られている。)プロパティではなく、「部材VAR」

です。一般に、オブジェクトの存続期間中はプロパティを保持する必要があります。プロパティが接続されている場合IBOutlet、これはNIBローダーによって行われます。それ以外の場合は、明示的に指定し、プロパティのretainまたはcopy属性を使用する必要があります。

オブジェクトを所有することが予想されるオブジェクトの場合、保持ループを回避するには、プロパティに常にassignとマークする必要があります。例えば、オブジェクトは、通常(通常、しかし必ずしも --every CSルールは例外があります。)それはデリゲートとして機能するために任意のオブジェクトを所有している