2

このメソッドretainCountは、符号なし整数を返すことになっています。

では、なぜ[@"Hi" retainCount]-1 が返されるのでしょうか。

4

5 に答える 5

10

簡単な答えは、@"Hi" は文字列リテラルであるため、バイナリ実行可能イメージに常に存在し、「消える」ことはないため、保持/解放は効果がなく、表示されますUINT_MAX(これは次のようになります -たとえば、%d で署名されて印刷された場合は 1 です) (これらのセマンティクスを持つ NSObjects に関する Pete Kirkham の回答を参照してください)。

これを超えて、 @"Hi" は のように動作NSString*しますが、実際にはコンパイラによって作成されたクラスCFConstantString(またはおそらく NSConstantString、私のデバッガーは一部のドキュメントに同意しない) のインスタンスであり、リテラル文字列データをラップし、 NSString* インターフェイスを提供します。しかし、コンパイラは、これらの文字列が特別であり、クリーンアップできないことを認識しているため、常に UINT_MAX (-1) の保持カウントを持ちます。

于 2010-01-06T17:16:23.733 に答える
6

Apple のNSObject documentationUINT_MAXによると、決して解放されないオブジェクトを返す必要があります。UINT_MAX符号付き int として出力すると、通常は が表示されます。これは、あなた-1がしていることかもしれません。

于 2010-01-06T17:10:38.510 に答える
3

retainCountメソッドに頼らないでください。Cocoa は舞台裏であらゆる種類の最適化を行うため、このretainCount方法は信頼性が低く、役に立たなくなります。Apple でさえ、それを使用することを思いとどまらせています。retainCountCocoa 用に設定されたメモリ管理ルールに固執すれば、オブジェクトの を知る必要はありません。

于 2010-01-06T20:19:17.967 に答える
0

@"Hello" はコードでリリースする必要はありません。

オブジェクトが「alloc」によって作成されたことに注意してください。その他のメモリリークの問題はありません

于 2010-01-06T17:53:19.353 に答える
0

符号付き整数と符号なし整数の唯一の違いは、値の解釈方法です。-1 を unsigned int として読み取ると、unsigned int の最大値であることがわかります。

例えば:NSLog(@"%u", [@"Hello" retainCount]);

この値が非常に大きい理由は、定数文字列オブジェクトの割り当てが解除されないためです。

于 2010-01-06T17:19:44.373 に答える