2009-09-07 3 views
5

私はプロジェクトで作業していましたが、文字列の保持カウントが何かを確認する必要があります。NSString retain Count

しかし、いつも私は "2147483647"を返します、なぜそうですか?

このコードを確認してください。だから私の質問は、なぜそれが他のオブジェクトと同様に1を返すされていないされて

NSString *str = [[NSString alloc] initWithString:@"Hello World"]; 
NSLog(@"String Retain Count: %i", [str retainCount]); 

は、なぜ私は事前に「2147483647」

感謝を取得しています、返します。

+0

これはコミュニティウィキはなぜですか? –

+0

うわー、もし私がどこにいてもいけない場所をクリックすれば、このウェブサイトの新しいものは本当に意味が分からない、残念です。 – itsaboutcode

+0

心配しないでください。それをコミュニティのwikiにするのは良いことです。 – Chuck

答えて

24

コンパイラはあなたよりスマートです。

@"Hello world"と表示されており、「ああ!

次に、[[NSString alloc] initWithString:@"Hello world!"]と表示され、「Aha!定数文字列で作成された不変オブジェクト!

次に、retainCountUINT_MAXの単一のNSConstantStringに縮小され、決して放出されないようにします。

+0

OK NSStringの場合、1の保持カウントを得る方法を教えてください。 – itsaboutcode

+2

@itsaboutcode retainCountsの点でこれについて考えないことをお勧めします"私はこの文字列を割り当てたので、リリースしなければなりません"と思って、retainCountsが自分自身を並べ替えるようにしましょう。数年のうちに私はObjective-Cで書いています。メモリ管理規則に従えば、あなたはうまくいくでしょう。 –

+0

@ Dave DeLong でオブジェクトを作成したとしたら、これは私が考えていた方法です。 NSString * str = [[NSString alloc] initWithString:@ "Hello World"]; それから私はそれを解放すべきですか?しかし、私はそれを解放しなければならない場合、私はその保持カウントは何ですか?さもなければ、私はそこにないオブジェクトにメッセージを送信し、結果は私のプログラムがクラッシュすることになります! – itsaboutcode

2

文字列は、可変オーバーヘッドなどを節約するために、静的に割り当てられたNSStringのインスタンスとコンパイル時に最適化されています。静的な文字列は、あなたが開発しているどのプラットフォームでも最大の整数を保持しているので、このような高い保持カウントが見られます。

2
NSString *str = [[NSString alloc] initXXX 

通常、いくつかのRAMを割り当ててポインタを返します。このRAMはリリースとreatinsの対象となります。しかし、あなたが行うとき:返さ

NSString *str = [[NSString alloc] initWithString:@"Hello World"]; 

文字列は、それは文字列リテラルであったため、すでに割り当てられている@の「Hello World」、です。それは文字列リテラルなので、解放する方法はないため、システムはそれをunreleasableとしてマークする必要があります。それが行う方法は、保持カウントを最大整数値に設定することです。そこに文字列定数がありますが

NString *str = [[NSString alloc] initWithFormat:@"Hello World. Today is @%", todayDate]; 

この文字列は1のretainCountを持つことになり、それが別の文字列でに追加されます。その定数文字列を変更することはできないので、 "Hello World。"文字列が作成され、todayDate文字列の内容がその文字列に追加されます。そのメモリは今、1のretainCountで呼び出し元に所有権が与えられます。