このメソッドretainCount
は、符号なし整数を返すことになっています。
では、なぜ[@"Hi" retainCount]
-1 が返されるのでしょうか。
このメソッドretainCount
は、符号なし整数を返すことになっています。
では、なぜ[@"Hi" retainCount]
-1 が返されるのでしょうか。
簡単な答えは、@"Hi
" は文字列リテラルであるため、バイナリ実行可能イメージに常に存在し、「消える」ことはないため、保持/解放は効果がなく、表示されますUINT_MAX
(これは次のようになります -たとえば、%d で署名されて印刷された場合は 1 です) (これらのセマンティクスを持つ NSObjects に関する Pete Kirkham の回答を参照してください)。
これを超えて、 @"Hi" は のように動作NSString*
しますが、実際にはコンパイラによって作成されたクラスCFConstantString
(またはおそらく NSConstantString、私のデバッガーは一部のドキュメントに同意しない) のインスタンスであり、リテラル文字列データをラップし、 NSString* インターフェイスを提供します。しかし、コンパイラは、これらの文字列が特別であり、クリーンアップできないことを認識しているため、常に UINT_MAX (-1) の保持カウントを持ちます。
Apple のNSObject documentationUINT_MAX
によると、決して解放されないオブジェクトを返す必要があります。UINT_MAX
符号付き int として出力すると、通常は が表示されます。これは、あなた-1
がしていることかもしれません。
retainCount
メソッドに頼らないでください。Cocoa は舞台裏であらゆる種類の最適化を行うため、このretainCount
方法は信頼性が低く、役に立たなくなります。Apple でさえ、それを使用することを思いとどまらせています。retainCount
Cocoa 用に設定されたメモリ管理ルールに固執すれば、オブジェクトの を知る必要はありません。
@"Hello" はコードでリリースする必要はありません。
オブジェクトが「alloc」によって作成されたことに注意してください。その他のメモリリークの問題はありません
符号付き整数と符号なし整数の唯一の違いは、値の解釈方法です。-1 を unsigned int として読み取ると、unsigned int の最大値であることがわかります。
例えば:NSLog(@"%u", [@"Hello" retainCount]);
この値が非常に大きい理由は、定数文字列オブジェクトの割り当てが解除されないためです。