0
NSMutableString *ms = [[NSMutableString alloc]init];
[ms appendFormat:@"element %ld",1];
[ms appendFormat:@"element %ld",2];
NSMutableString *ms2 = [ms mutableCopy];
NSLog(@"ms retain count:%lu",ms.retainCount);
NSLog(@"ms2 retain count:%lu",ms2.retainCount);
NSValue *sw = [NSValue valueWithNonretainedObject:ms2];
NSMutableArray *a = [NSMutableArray array];
[a addObject:ms];
[a addObject:sw];
NSLog(@"ms retaincount %lu",ms.retainCount);
NSLog(@"ms2 retaincount %lu",ms2.retainCount);
4

2 に答える 2

13

あなたの問題は、あなたretainCountが役に立つことを期待していることです。

そうではありません。存在することをretainCount忘れてください。

しかし、次のことが起こります。

NSMutableString *ms = [[NSMutableString alloc]init];

可変文字列を作成しました。 あなたはそれを所有し、それに対して責任がありますreleasing

[ms appendFormat:@"element %ld",1];
[ms appendFormat:@"element %ld",2];

文字列にデータを追加します。所有権の変更はありません。

NSMutableString *ms2 = [ms mutableCopy];

文字列のコピーを作成します。 あなたはコピーを所有し、それに対して責任がありますreleasing

NSValue *sw = [NSValue valueWithNonretainedObject:ms2];

文字列コピーへのポインターをNSValue. あなたは を所有しておらずNSValue(したがって所有する必要もありません)、バリアントreleaseを使用しているため、オブジェクトの所有権は変更されません。NonretainedObject:ms2

NSMutableArray *a = [NSMutableArray array];

可変配列を作成します。あなたはそれを所有していません。

[a addObject:ms];

配列にオブジェクトを追加します。 配列はオブジェクトも所有するようになりました

[a addObject:sw];

配列にオブジェクトを追加します。 配列がオブジェクトを所有するようになりました(まだ所有していません)。

したがって、このコードの最後には、次のものがあります。

  • ms
  • ms2

これは、コードが正しいためには、以下も必要であることを意味します。

[ms release];
[ms2 release];

編集:

オブジェクトをいつ「所有」し、いつ所有していないかをどのように知ることができますか? それはとても簡単です:

  • " " で始まるメソッドを使用してオブジェクトを取得すると、allocまたは...
  • " " で始まるメソッドを使用してオブジェクトを取得すると、newまたは...
  • " copy" または...
  • retainオブジェクトを明示的に " "

覚えておいてください:New-Alloc-Retain-Copy(「NARC」)。これらの 4 つの条件のいずれかを満たしている場合 (およびドキュメント/メソッドの宣言で別のことが述べられていない場合)、オブジェクトを「所有」し、そのオブジェクトに対してreleaseorautoreleaseを呼び出してその所有権を放棄する必要があります。

これはすべて、「メモリ管理プログラミング ガイド」に非常にわかりやすく説明されています。

于 2011-04-21T04:55:38.370 に答える
1
  1. あなたが所有する新しい可変文字列 ms が作成されます (「割り当て」た場合は、あなたが所有します*)。したがって、保持カウント 1 から始まります (「自動解放」されません)。
  2. 同じことがms2にも当てはまります(「コピー」で作成した場合は、それを所有しています*)
  3. ms2 は NSValue の sw によってラップされますが、sw は ms2 (valueWithNonRetainedObject) を保持したくないため、ms2 の保持カウントは増加しません。
  4. ms と sw が可変配列 a に追加されます。配列は常に要素を保持するため、ms と sw の保持カウントは 1 増加しますが、ms2 は配列の要素ではないため (しかし NSValue sw の要素であるため)、保持カウントは増加しません。

*)メモリ管理ルールを参照してください

于 2011-04-21T05:44:30.357 に答える