2011-01-19 12 views

答えて

4

ivarを直接リリースすることをお勧めします。サブクラスがプロパティのセッターメソッドをオーバーライドすると、セッターが呼び出されないためオブジェクトがリークする可能性があります。考えてみましょう:ClassBのの

@interface ClassA 
@property (readwrite, retain) id anObject; 
@end 

@interface ClassB : ClassA 
@end 

@implementation ClassA 
@synthesize anObject; 

- (void)dealloc { 
    self.anObject = nil; 

    [super dealloc]; 
} 
@end 

@implementation ClassB 
- (void)setAnObject: (id)anObject { 
    // do nothing! 
} 
@end 

インスタンスをanObjectをリークします!

+1

+1これは正しいです。 'dealloc'で直接ivarを'解放する '方が良いでしょう。 –

+0

「割り当て」を使用せずに「保持」を使用しない場合はどうすればいいですか? deallocでは "nil"に設定する必要がありますか? – Abhinav

+2

あなたが 'assign'を使っているなら、それは問題ではありません。 'retain'や' copy'を使っているのであれば、それを適切に解放するよう注意しなければなりません。 –

1

どのようあなたがプロパティのセッター(推奨されません)を介してそれを行う場合は、それを行う、[はいを依存します。

割り当てを直接行うと、保持されたオブジェクトがリークするので、はnoです。

だから、これは大丈夫です:

- (void) dealloc { 
    self.test = nil; 
    [super dealloc]; 
} 

しかし、これは無行くです:

- (void) dealloc { 
    test = nil; 
    [super dealloc]; 
} 

私のアドバイスはただであなたの保持アイバーズのすべてにreleaseメッセージを送信することです-deallocの場合、testnilの場合は何も起こりませんので、これはうまく動作します。

私を信頼してください。 -deallocに直接releaseを送信してください。それだけです。

+0

割り当てに問題がありますか? – Abhinav

+2

setterを呼び出さないので、解放するのではなくオブジェクトをリークします。 –

+0

また、 'dealloc'の中でプロパティを使うべきではないという事実もあります... –

関連する問題