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);
2 に答える
あなたの問題は、あなた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 つの条件のいずれかを満たしている場合 (およびドキュメント/メソッドの宣言で別のことが述べられていない場合)、オブジェクトを「所有」し、そのオブジェクトに対してrelease
orautorelease
を呼び出してその所有権を放棄する必要があります。
これはすべて、「メモリ管理プログラミング ガイド」に非常にわかりやすく説明されています。
- あなたが所有する新しい可変文字列 ms が作成されます (「割り当て」た場合は、あなたが所有します*)。したがって、保持カウント 1 から始まります (「自動解放」されません)。
- 同じことがms2にも当てはまります(「コピー」で作成した場合は、それを所有しています*)
- ms2 は NSValue の sw によってラップされますが、sw は ms2 (valueWithNonRetainedObject) を保持したくないため、ms2 の保持カウントは増加しません。
- ms と sw が可変配列 a に追加されます。配列は常に要素を保持するため、ms と sw の保持カウントは 1 増加しますが、ms2 は配列の要素ではないため (しかし NSValue sw の要素であるため)、保持カウントは増加しません。