0

ここでは、10 通りの方法で変数を割り当てNSStringましたが、それらすべての保持カウントを知りたいと考えています。

@interface SomeClass : NSObject 
{ 
   NSString *str1; 
   NSString *str2;
} 
@property (nonatomic, retain) NSString* str1;
@property (nonatomic, copy) NSString * str2; 


 - str1 =@"hello";

 - self.str1 = @"hello";

 - str1 = [[NSString alloc]init];

 - self.str4 = [[NSString alloc]init];

 - str1 = [[[NSString alloc]init]autorelease];

 - self.str1 = [[[NSString alloc]init]autorelease];

 - str1 = [[NSString alloc]initWithString:@"hello"];

 - self.str1 = [[NSString alloc]initWithString:@"hello"];

 - str1 = [[[NSString alloc]initWithString:@"hello"]autorelease];

 - self.str1 = [[[NSString alloc]initWithString:@"hello"]autorelease];

NSString上記の割り当ての保持数は何ですか? それらの保持カウントがすべて異なる保持カウントであることをどのように知ることができますか?

4

2 に答える 2

4

これは宿題のように思えますがretainCount、各文字列を呼び出して実際の値の近似値を取得できます。本番アプリのロジックには絶対にこのメソッドを使用しないでください ( http://whentouseretaincount.comを参照してください)。ドキュメントには次のように記載されています。

特別な考慮事項

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

于 2013-04-19T02:50:30.917 に答える
4

それらは SomeClass メソッドでアクセスされると思います。バリアント:

// replace str1 with str2(copy), retain count will remain the same
str1 = @"hello";
self.str1 = @"hello"
str1 = [[NSString alloc]initWithString:@"hello"];
self.str1 = [[NSString alloc]initWithString:@"hello"];
str1 = [[[NSString alloc]initWithString:@"hello"]autorelease];
self.str1 = [[[NSString alloc]initWithString:@"hello"]autorelease];

ここでは、UINT_MAX のような巨大な値になり、コンパイラはコードを最適化し (リテラル値を渡すと、NSString は不変になります)、それらのオブジェクトは解放できなくなります。

self.str1 = [[NSString alloc] initWithFormat:@"a string %d", 5]; // with autorelease or not - the same

ここでは、リリース カウント = 2 になり、文字列 +1 を割り当て、保持プロパティ +1 = 2 を割り当てます。

self.str2 = [[NSString alloc] initWithFormat:@"a string %d", 5]; // with autorelease or not - the same

ここでは、リリース カウント = 1 になり、文字列 +1 を割り当て、コピー プロパティを割り当て、作成された文字列 = 1 のコピーを作成します。

他のすべての状況では、解放カウント = 1 になります。自動解放は保持カウントに追加されません。プールがドレインされると、カウントが 1 減るだけです。

覚えとけ:

  1. 保持カウントに依存しないでください。
  2. alloc、new、copy、mutable copy でオブジェクトを作成する場合、それを解放するのはあなたの責任です。[NSString string] のようなオブジェクトを作成すると、自動解放されます。
  3. 保持プロパティはオブジェクトを保持し、コピー プロパティはオブジェクトをコピーします。プロパティは通常、ドット表記 (self.property など) を介して使用されます (合成された set%Property% および %property% メソッドもあるため、self.property = ... は (通常) [self setProperty:...] と同じ)
  4. ARCに移行する時が来ました。だからできるならそうするべきです。
于 2013-04-19T02:50:43.800 に答える