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