0

非アトミック コピー アクセサーを作成しようとしていますが、最後にオブジェクトを解放する必要があることをどこでも読みました。ですから、私がそれを適切に行っているかどうかを理解するのを手伝っていただければ幸いです. 以下は正しいでしょうか?

@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 の割り当てを解除する必要があるかどうか、およびそれを正しく行ったかどうかの確認を探しています。

どうもありがとう。

4

2 に答える 2

1

はい、解放する必要があります。(物事の割り当てを解除しません。それらの所有権を解放すると、結果として割り当てが解除される可能性があります。)

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

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

于 2014-08-16T20:47:31.847 に答える
1

@ケントーマスは正しいです。あなたのコードは正しいです。ただし、いくつかのこと:

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

この場合、stringAdealloc でクラスによって解放されますが、そのためのコードを記述する必要はありません。ARC がそれを行います。

于 2014-08-16T21:12:29.280 に答える