次の表記を使用して文字列を作成する場合:
NSString *foo = @"Bar";
リリースする必要がありfoo
ますか?またはfoo
、この場合は自動解放されますか?
次の表記を使用して文字列を作成する場合:
NSString *foo = @"Bar";
リリースする必要がありfoo
ますか?またはfoo
、この場合は自動解放されますか?
コンパイラによって割り当てられた文字列 (@"STRING" の形式) は定数であるため、それらに対する -retain、-release、および -autorelease メッセージは無視されます。この場合、foo を解放または自動解放する必要はありません (ただし、害はありません)。
ドキュメントで述べたように
名前が「alloc」または「new」で始まるメソッド、または「copy」を含むメソッド (たとえば、alloc、newObject、または mutableCopy) を使用してオブジェクトを作成した場合、または保持メッセージを送信した場合、オブジェクトの所有権を取得します。release または autorelease を使用して、所有しているオブジェクトの所有権を放棄する責任があります。それ以外のオブジェクトを受け取った場合は、それを解放してはなりません。
alloc や copy などを使用していないため、オブジェクトの解放について心配する必要はありません。
@Ben\ Gottlieb の「コンパイラによって割り当てられた文字列 (@"STRING" の形式) は定数です」に同意しますが、alloc
またはretain
メッセージを渡すことでそれらを初期化していないため、それらに渡しrelease
たりautorelease
メッセージを送ったりしないでください。そうしないと、アプリがクラッシュします。次のログで
「解放されるポインタは割り当てられませんでした」
NSString *str = [NSString string];
次と同等です。
NSString *str = [[[NSString alloc] init] autorelease];
sorelease
またはautorelease
ここでも渡してはなりません。