3

メソッドNSString内のAppDelegateクラス内の保持数を出力したいdidFinishLaunchingWithOptions

NSString *str = [[NSString alloc] init];
NSLog(@"str retain count %d",[str retainCount]);

しかし、それは常に+1の代わりに-1を与えます....なぜ???

4

3 に答える 3

4

NSUIntegerMax返されたオブジェクトが不滅であることを意味します。これは以前はドキュメントにありましたが、削除されました (-retainCount非常に推奨されていないため)。

MRC では、実際にオーバーライド-retainCountして、シングルトンの割り当てが解除されないようにする人もいます。

[[NSString alloc] init]この場合、要求ごとに空の文字列を作成するのではなく、定数/不滅を返すことが論理的な最適化です。もちろん、プログラムでこの詳細/動作に依存するべきではありません。

于 2013-03-06T08:56:11.993 に答える
3

アップルのドキュメントは次のように述べています。

特別な考慮事項

この方法は、メモリ管理の問題をデバッグする際には役に立ちません。オブジェクトへの参照を保持するために任意の数のフレームワーク オブジェクトがオブジェクトを保持している可能性があると同時に、自動解放プールがオブジェクトの任意の数の遅延リリースを保持している可能性があるため、これから有用な情報を取得できる可能性はほとんどありません。方法。

したがって、その正しさを当てにするべきではありません。

また、-1負の値ではなく、実際には最大の符号なし整数です。Retain count は を返すため、の代わりにNSUInteger使用する必要があります。%u%d

于 2013-03-06T08:51:41.910 に答える
1

-retainCount他の人の回答で指摘されているように、通常、この方法は使用しないでください。NSStringその理由は、作成方法に応じて、多くの保持/解放作業がクラス内で行われるためです。を作成すると、NSString実際には多くのNSStringサブクラスの 1 つを作成できます (id初期化子の戻り値の型は特定されません)。

すべてNSConstantStrings( によって作成されたもの@"") は解放可能ではありません。それらはプログラムの期間中 (gcc と clang の両方で指定されているように) 存在します。このように、Apple はretainCount可能な最大の符号なし整数 (ここにあるように、符号付きとして読み取られる場合は -1)を任意に設定しました。保持カウント。

あなたが持っている方法で空の文字列を作成すると、@""実行時に占有するスペースが少なくなるため、Apple がメモリ内の定数を自動的に指す可能性があります。オブジェクトが になったNSConstantStringため、-1 の保持カウントを返すように実装されています。

EDIT:ちなみに、NSConstantStringそのサブクラスは、を含むNSStringメソッドを実装する必要があります。これが、実際に定数文字列オブジェクトでメソッドを呼び出すことができる理由です(そして Apple が特別な値を返すようにする理由です)。この継承関係は、ヘッダーの下部近くにあります。NSString-retainCount-retainCountNSString.h

于 2013-03-06T09:04:02.203 に答える