2010-12-14 9 views
1

次のコードのメモリ割り当てが不思議です。私はその後、@ "文字列"はどのようにメモリに割り当てられていますか?

myString = @"Hello world"; 

を呼び出すとき@""

は何が起こるか私は、これは自動解放空の文字列を作成します知っている

NSString *myString = [NSString string]; 

は、提供する自動解放オブジェクトNSStringと同じ私の参照であるか、私はちょうどでした私は解放の責任を負う新しいオブジェクトを割り当てますか?

答えて

8

あなたがオブジェクトを所有しているかどうか迷ったとき、自分自身に問う:

は、私は、このオブジェクトを作成するために使用方法...

  • newで始まりますか?
  • allocで始まる?
  • には、copyが含まれていますか?
  • 等価retain

あなたがそれらのいずれかに「はい」と答えることができる場合は、返されたオブジェクトにreleaseまたはautoreleaseを呼び出すための責任があります。 (Core Foundationのための規則は、オブジェクトが多少異なるであることに注意してください。また、ドキュメントが明示的にはこれが勝利矛盾すると言うものは。ドキュメントは常に指針に取って代わることに注意)への回答、あなたの文字列の場合は

あなたの質問はすべて「いいえ」なので、あなたはそのオブジェクトに責任を負いません。定数文字列(スタイル@"foo")はアプリケーションバイナリにハードコードされており、を割り当て解除できません。しかし、それは実装の詳細です。あなたがメモリ管理のルールに従う限り、あなたは良いでしょう!

+1

最近私はメモリ管理に関する非常に良い記事を読んできました。http://goo.gl/Tp8WW これはあなたがより理解しやすくなることを願っています。 –

+0

おかげさまで、私は一般的にココアのメモリ管理に非常に慣れています。ハードコーディングされた文字列がどのように機能するか少し不安でした。 –

+1

@ Flash84x:割り当て解除を防ぐ実装の詳細は、定数文字列の保持カウントがINT_MAXであることです。これは実行時に特別なケースとして扱われ、 'retain'と' release'をno-opsに変えます。 – JeremyP

関連する問題