"Assign"プロパティで定義された変数を持つ場合、deallocメソッドでnilに設定しても問題ありませんか?"Assign"プロパティを持つオブジェクトをnilに設定する
@property (nonatomic, assign) id test;
- (void)dealloc {
self.test = nil;
}
"Assign"プロパティで定義された変数を持つ場合、deallocメソッドでnilに設定しても問題ありませんか?"Assign"プロパティを持つオブジェクトをnilに設定する
@property (nonatomic, assign) id test;
- (void)dealloc {
self.test = nil;
}
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
をリークします!
はどのようあなたがプロパティのセッター(推奨されません)を介してそれを行う場合は、それを行う、[はいを依存します。
割り当てを直接行うと、保持されたオブジェクトがリークするので、はnoです。
だから、これは大丈夫です:
- (void) dealloc {
self.test = nil;
[super dealloc];
}
しかし、これは無行くです:
- (void) dealloc {
test = nil;
[super dealloc];
}
私のアドバイスはただであなたの保持アイバーズのすべてにrelease
メッセージを送信することです-dealloc
の場合、test
がnil
の場合は何も起こりませんので、これはうまく動作します。
私を信頼してください。 -dealloc
に直接release
を送信してください。それだけです。
割り当てに問題がありますか? – Abhinav
setterを呼び出さないので、解放するのではなくオブジェクトをリークします。 –
また、 'dealloc'の中でプロパティを使うべきではないという事実もあります... –
+1これは正しいです。 'dealloc'で直接ivarを'解放する '方が良いでしょう。 –
「割り当て」を使用せずに「保持」を使用しない場合はどうすればいいですか? deallocでは "nil"に設定する必要がありますか? – Abhinav
あなたが 'assign'を使っているなら、それは問題ではありません。 'retain'や' copy'を使っているのであれば、それを適切に解放するよう注意しなければなりません。 –