質問があります。私の.hで:
NSString *string;
@property(nonatomic, retain)NSString *string;
私の.mで:
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
わかりました、「stringWithFormat」は自動解放メソッドです。dealloc で「文字列」を解放する必要がありますか??
質問があります。私の.hで:
NSString *string;
@property(nonatomic, retain)NSString *string;
私の.mで:
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
わかりました、「stringWithFormat」は自動解放メソッドです。dealloc で「文字列」を解放する必要がありますか??
self.string = .... のみが stringWithFormat を保持します。
したがって、リリースする必要はありません。ただし、後でアクセスしようとすると、文字列が解放され、アプリがクラッシュすることに注意してください。文字列を保持したい場合は、作成してください
self.string = .....
そしてdeallocでそれを解放します
真剣に。これは、保持/解放について心配する必要がなくなったことを意味します(ただし、とにかく心配しなければならなかった参照サイクルについて心配する必要があります)。
ARCを使用していない場合は、文字列の「所有権」を取得していないため(保持することにより)、上記のコードがクラッシュします。正しく保持するか、次のようにします。
[string release];
string=[[NSString stringWithFormat:@"%@", otherStringWithValue] retain];
または、セッターを使用します。セッターは(自動的に生成される場合)正しく保持されます。
self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];
では-dealloc
、次にivarを解放する必要があります。または、setterを使用することもできます(自動的に解放されます)。
self.string = nil;
ARCの前は、私の経験則では、ほとんどの場合、プロパティ構文を使用していました。これは、正しいことを実行するためです。
宣言している文字列が上記のコードのプロパティの一部である場合は、初期化する必要がありますが、そうです。所有権はまだあなたが世話をすることです。
これの代わりに:
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
これを行う:
self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];
ここで、dealloc で文字列を解放する必要があります。ただし、 +stringWithFormat は自動解放されたオブジェクトを返しますが、保持されたプロパティを宣言したため、それを解放する責任があります。
属性はプロパティにのみ適用されます。プロパティに直接アクセスすることはできません。「.」経由でアクセスできます。それだけ。
だから、書くときは、
string=[NSString stringWithFormat:@"%@", otherStringWithValue];
変数にアクセスしています。そのため、保持は呼び出されません。また、stringWithFormat
自動解放されたオブジェクトを返します。したがって、dealloc で解放する必要はありません。ただし、いつ解放されるかわからないため、スコープを超えてこの変数にアクセスすることはできません。
あなたが書くなら、
self.string=[NSString stringWithFormat:@"%@", otherStringWithValue];
プロパティにアクセスしており、その値は保持されます。したがって、dealloc メソッドで解放する必要があります。
このコードでは、stringWithFormat が autorelease オブジェクトを返し、文字列を保持しているため、メモリ リークが発生します。したがって、stringWithFormat の値を文字列に割り当てると、新しい autorelease オブジェクトが提供されます。 1 であるため、解放されません。ただし、文字列を解放しようとすると、割り当て後に autorelease オブジェクトが含まれるため、クラッシュします。