1

カスタムUIViewControllerに、次のように「割り当て」(「保持」ではない)として定義されているメンバー変数があります。

@property (nonatomic, assign) UIButton* mSkipButton;

loadViewメソッドで、変数、たとえばself.mSkipButtonを、変数タイプの自動解放された割り当てに設定しました。次に、基本的にビュー参照カウントを持つコントローラーのビューにアタッチし、必要に応じて解放します。

ただし、これは、メンバーvarにポインターが格納されていることと、ある時点でカウントが減少した場合に解放されたメモリーを参照している可能性があることを懸念しています。代わりに、変数を「retain」として宣言してから、viewDidUnloadメソッドでメンバーvarを解放する(または解放するためにnilに設定して、そこにアドレスがないことを確認する)方が良い方法ですか?

または、viewDidUnloadでメンバーvarをnilに設定し、それを保持変数にしないことはできますか?

4

2 に答える 2

2

代わりに、変数を「retain」として宣言してから、viewDidUnload ...で宣言することをお勧めしますか?

はい、使用してretainください-良い本能。ではviewDidUnload、通常nil、ivarのセッターを使用して次のように設定します。self.ivar = nil;

の使用に関連する問題に対処するよりも、オブジェクトの相互依存関係を明示的に認識して管理する方が簡単だと思いますassign。管理されていない参照を保持する問題を完全に回避できます。

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

于 2012-01-05T22:12:40.733 に答える
2

これはプロパティであり、「メンバー var」ではありません (Objective-C ではインスタンス変数またはivarとして知られています)。

プロパティのセマンティクスは、そのプロパティがどのように使用されるかによって異なります。一般的に言えば、オブジェクトの存続期間中、プロパティを保持する必要があります。プロパティが connected の場合IBOutlet、これは NIB ローダーによって行われます。retainそれ以外の場合は、プロパティでorcopy属性を明示的に使用する必要があります。

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

于 2012-01-05T21:32:48.797 に答える