メソッドNSString
内のAppDelegate
クラス内の保持数を出力したいdidFinishLaunchingWithOptions
NSString *str = [[NSString alloc] init];
NSLog(@"str retain count %d",[str retainCount]);
しかし、それは常に+1の代わりに-1を与えます....なぜ???
NSUIntegerMax
返されたオブジェクトが不滅であることを意味します。これは以前はドキュメントにありましたが、削除されました (-retainCount
非常に推奨されていないため)。
MRC では、実際にオーバーライド-retainCount
して、シングルトンの割り当てが解除されないようにする人もいます。
[[NSString alloc] init]
この場合、要求ごとに空の文字列を作成するのではなく、定数/不滅を返すことが論理的な最適化です。もちろん、プログラムでこの詳細/動作に依存するべきではありません。
アップルのドキュメントは次のように述べています。
特別な考慮事項
この方法は、メモリ管理の問題をデバッグする際には役に立ちません。オブジェクトへの参照を保持するために任意の数のフレームワーク オブジェクトがオブジェクトを保持している可能性があると同時に、自動解放プールがオブジェクトの任意の数の遅延リリースを保持している可能性があるため、これから有用な情報を取得できる可能性はほとんどありません。方法。
したがって、その正しさを当てにするべきではありません。
また、-1
負の値ではなく、実際には最大の符号なし整数です。Retain count は を返すため、の代わりにNSUInteger
使用する必要があります。%u
%d
-retainCount
他の人の回答で指摘されているように、通常、この方法は使用しないでください。NSString
その理由は、作成方法に応じて、多くの保持/解放作業がクラス内で行われるためです。を作成すると、NSString
実際には多くのNSString
サブクラスの 1 つを作成できます (id
初期化子の戻り値の型は特定されません)。
すべてNSConstantStrings
( によって作成されたもの@""
) は解放可能ではありません。それらはプログラムの期間中 (gcc と clang の両方で指定されているように) 存在します。このように、Apple はretainCount
可能な最大の符号なし整数 (ここにあるように、符号付きとして読み取られる場合は -1)を任意に設定しました。保持カウント。
あなたが持っている方法で空の文字列を作成すると、@""
実行時に占有するスペースが少なくなるため、Apple がメモリ内の定数を自動的に指す可能性があります。オブジェクトが になったNSConstantString
ため、-1 の保持カウントを返すように実装されています。
EDIT:ちなみに、NSConstantString
そのサブクラスは、を含むNSString
メソッドを実装する必要があります。これが、実際に定数文字列オブジェクトでメソッドを呼び出すことができる理由です(そして Apple が特別な値を返すようにする理由です)。この継承関係は、ヘッダーの下部近くにあります。NSString
-retainCount
-retainCount
NSString.h