21

次の表記を使用して文字列を作成する場合:

NSString *foo = @"Bar";

リリースする必要がありfooますか?またはfoo、この場合は自動解放されますか?

4

3 に答える 3

18

コンパイラによって割り当てられた文字列 (@"STRING" の形式) は定数であるため、それらに対する -retain、-release、および -autorelease メッセージは無視されます。この場合、foo を解放または自動解放する必要はありません (ただし、害はありません)。

于 2008-12-01T03:43:15.530 に答える
15

ドキュメントで述べたように

http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Tasks/MemoryManagementRules.html

名前が「alloc」または「new」で始まるメソッド、または「copy」を含むメソッド (たとえば、alloc、newObject、または mutableCopy) を使用してオブジェクトを作成した場合、または保持メッセージを送信した場合、オブジェクトの所有権を取得します。release または autorelease を使用して、所有しているオブジェクトの所有権を放棄する責任があります。それ以外のオブジェクトを受け取った場合は、それを解放してはなりません。

alloc や copy などを使用していないため、オブジェクトの解放について心配する必要はありません。

于 2008-12-01T04:12:01.153 に答える
7

@Ben\ Gottlieb の「コンパイラによって割り当てられた文字列 (@"STRING" の形式) は定数です」に同意しますが、allocまたはretainメッセージを渡すことでそれらを初期化していないため、それらに渡しreleaseたりautoreleaseメッセージを送ったりしないでください。そうしないと、アプリがクラッシュします。次のログで

「解放されるポインタは割り当てられませんでした」

ノート

NSString *str = [NSString string];

次と同等です。

NSString *str = [[[NSString alloc] init] autorelease];

soreleaseまたはautoreleaseここでも渡してはなりません。

于 2010-12-17T10:46:18.607 に答える