1

私はいくつかのチュートリアルといくつかの情報を調べてきましたが、変数を解放するための最良の方法または最良の場所についての明確な答えはありません。

この状況を見てみましょう。次の 2 つの変数があります。

@property (nonatomic, strong) IBOutlet UIButton *myButton;
@property (nonatomic, strong) NSString *myString;

...

@synthesize myButton = _myButton, myString = _myString;

これはそれらを解放する最良の方法ですか?:

   -(void)viewDidUnload {

    self.myButton = nil;
    self.myString = nil;
    [super viewDidUnload];

 }

-(void)dealloc{

   [_myButton release];
   [_myString release];
   [super dealloc];

}

dealloc が呼び出されたとき、viewDidUnload が呼び出されたとき、その方法が正しいかどうか、なぜその方法で行わなければならないのかを知りたいだけです。

みんなありがとう

4

2 に答える 2

3

init と dealloc でプロパティ アクセサー メソッドを使用しないことをお勧めします。オブジェクトに他の情報が存在することを期待する可能性があるからです。自分が何をしているのか分かっていれば、dealloc でも self.myButton = nil を使用しても問題はありません。ただし、オブジェクトが破棄されているため、実際にはそれらを nil に設定する必要はありません - 一部のコードが誤って dealloc から実行されない限り (前述のアクセサー メソッドとして)。

viewDidUnload では、メンバーを解放するだけでなく、nil に設定する必要があります。これは、オブジェクトが引き続き存在し、ダングリング ポインターにアクセスしたくないためです。

したがって、あなたの例は、最高のパフォーマンスと最も安全なプログラミング方法でなければなりません。

于 2012-04-24T10:46:24.473 に答える
1

IBOutlets をプロパティとして宣言しない、保持せずにプロパティとして宣言するなどの方法もあります。ほとんどの場合、それらを保持されたプロパティにすることを好むことがわかりました。その後、明示的に解放する必要があります。この例は、あるView Controllerから別のView Controllerに切り替える場合です。1 つのビュー コントローラーが閉じられると、そのビューは削除され、解放されます。そのビューの IBOutlet UILabels も、保持しないと解放されます。つまり、古いビューに戻ったときに、ラベルとコントロールを最後の値に戻してリセットする必要がありますが、IBOutlet を保持していれば簡単に保存できたはずです。

viewDidUnload メソッドの使用に関するドキュメントを読みました。この方法の意味を理解したと思った

1) .h ファイルの @propery と .m-file の @syntesize で保持を使用します。self.object = something を使用してオブジェクトに値を割り当てます。この場合、self.object = nil; を設定します。viewDidUnload メソッドで。

2) オブジェクトを .h ファイルに保持していませんが、viewDidLoad メソッドでオブジェクトを割り当てて初期化しています。dealloc メソッドには [object release]; があります。viewDidUnload メソッドでは、[object release]; も設定しました。次回ビューが表示されるときに、viewDidLoad メソッドでオブジェクトが作成されるためです。

うまくいけば、これはあなたを助けるでしょう...

于 2012-04-24T10:53:20.240 に答える