/ /非アトミックコピーセッターの割り当て解除-Objective-C、メモリ管理、コピー、非アトミック

非原子コピーセッターの解放 - 客観的-c、メモリー管理、コピー、非原子

非原子コピーアクセサーを作成しようとしていますが、そして、オブジェクトが最後にリリースされるべきであることをどこでも読みました。ですから、あなたが私がそれをきちんとやっているかどうかを理解するのを手伝ってもらえたら、ありがたいです。次は正しいですか?

@interface ClassA: NSObject
{
NSString* stringA;
}

@property (nonatomic, copy) NSString* stringA;

@implementation ClassA

@synthesize stringA;

-(void) setStringA: (NSString*) stringInput {
if(stringA != stringInput) {
[stringA release];
stringA = [stringInput copy];
}
}

-(void) dealloc {
[stringA release];
[super dealloc];
}

最後にdeallocメソッドでstringAの割り当てを解除する必要があるかどうか、および正しく行ったかどうかの確認を探しています。

どうもありがとう。

回答:

回答№1は1

必要がある 解放 はい、そうです。 (あなたは物事の割り当てを解除しません。あなたはそれらの所有権を解放し、彼らは かもしれない 結果として割り当て解除されます。)

あなたのコードは正しいです。

規則では、名前が「alloc」または「new」で始まるか、「copy」を含むメソッドから受け取ったオブジェクトを解放する必要があります。また、保持しているオブジェクトを解放する必要があります。あなたが電話するので -copystringInput、あなたは最終的にそこから受け取るオブジェクトを解放する責任があります。


回答№2の場合は1

@Ken Thomasesは正しい。あなたのコードは正しいです。ただし、いくつかのことがあります。

本当にivarを宣言したり、プロパティを合成したり、独自のセッターを作成したりする必要はありません。これはすべてあなたのために行われます。

@interface ClassA: NSObject
@property (nonatomic, copy) NSString* stringA;
@end

@implementation ClassA

-(void) dealloc {
[_stringA release];
[super dealloc];
}

@end

次に、ARCを使用している場合(推奨)、コードをさらに単純化できます(deallocオーバーライドを完全に削除することにより)。

@interface ClassA: NSObject
@property (nonatomic, copy) NSString* stringA;
@end

@implementation ClassA
@end

この場合、stringA deallocでクラスによってリリースされますが、それを行うためのコードを記述する必要はありません。ARCが自動的に行います。