0

重複の可能性:
iOS の Dealloc メソッドとオブジェクトを nil に設定する

オブジェクト c のプロパティ dealloc に関しては、さまざまな種類のフォームを見てきました。次のうちどれが最良/正しいですか

//Kind1:
- (void)dealloc
{
    [_property release];
    [super dealloc];
}

//Kind2:
- (void)dealloc
{
    self.property = nil;
    [super dealloc];
}

//Kind3:
- (void)dealloc
{
    [_property release]; _property = nil;
    [super dealloc];
}
4

3 に答える 3

2

2 番目のオプションはお勧めできません。プロパティ セッターには副作用がある可能性があり、通常、オブジェクトが既に半分破棄されている可能性があることを考慮して実装されていません。一般に、dealloc からの self (または super) へのメソッド呼び出しは避ける必要があり[super dealloc]ます。また、半分解放されたオブジェクトへの参照に戻る可能性がある循環参照が存在する可能性があるため、他のオブジェクトに対する自明でない呼び出し (つまり、リリース以外のもの) を避ける必要があります。

最初のオプションで十分です。ARC を使用すると冗長になることに注意してください。ARC を使用することは、より安全であるだけでなく高速であるため、常に最善の策です。

3 番目のオプションは物議を醸しています。これにより、プログラムのエラーに対する回復力が高まると主張する人もいます (dealloc 後の参照は、インスタンス変数を介してバウンスしてセグメント フォールトが発生したり、さらに悪化したりするのではなく、ゼロ化されたインスタンス変数で終了する可能性があるため)。彼らはまた、値を使用しようとするメソッドを実行した場合、おそらく正常に失敗することが保証されると主張しています (その時点でダングリング ポインターを逆参照するのではなく)。しかし、そもそもこれを回避するという私の最初のポイントに同意すると、やや無意味になります。そして、私の経験では、その動作に依存することは悪い考えです。最初はクリーンな設計であっても、それを忘れてしまい、後でコードを変更してコードを壊してしまう可能性があります。

また、3 番目のオプションを嫌う人は、エラーが隠されていると主張します。ダングリング ポインタが逆参照された場合に明確にするために、nil ではなく明らかに偽の値 (0x0badf00d など) で明示的に上書きするものもあります。

于 2012-12-16T06:37:26.457 に答える
1

self.dealloc を呼び出さないでください。

-ed を実行releaseすると、それを作成する利点はまったくありませんnil

したがって、最初の 1 つが正しい使用方法deallocです。

于 2012-12-16T06:43:21.333 に答える
1

Kind1 で十分です。通常、alloc と dealloc で「self」を使用することはお勧めできません。coz self は setter/getter メソッドを呼び出します。カスタムの setter/getter メソッドがあると、問題が発生する可能性があります。

于 2012-12-16T05:34:34.000 に答える