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);
答えて
あなたの問題は、retainCount
が役に立つと予想していることです。
そうではありません、あなたはretainCount
が
をEXISTSことを忘れべきであるが、ここでは何が起こるかです:
NSMutableString *ms = [[NSMutableString alloc]init];
あなたは可変文字列を作成しました。 あなたはそれを所有し、あなたが文字列にいくつかのデータを追加releasing
それ
[ms appendFormat:@"element %ld",1];
[ms appendFormat:@"element %ld",2];
を担当しています。所有権の変更はありません。
NSMutableString *ms2 = [ms mutableCopy];
文字列のコピーを作成します。 あなたはNSValue
であなたの文字列のコピーへのポインタを格納
NSValue *sw = [NSValue valueWithNonretainedObject:ms2];
それをコピーを所有してreleasing
を担当しています。 NSValue
を所有していない(したがってrelease
は必要ありません)、NonretainedObject:
バリアントを使用しているため、ms2
オブジェクトの所有権は変更されません。
NSMutableArray *a = [NSMutableArray array];
可変配列を作成します。あなたはそれを所有していません。
[a addObject:ms];
オブジェクトを配列に追加します。 配列は今もあなたは配列にオブジェクトを追加するオブジェクト
[a addObject:sw];
を所有しています。 配列は、今、あなたが所有し、このコードの末尾にオブジェクト(あなたはまだそれを所有していない)
を所有している:
ms
ms2
この手段をあなたのコードが正しいようにするには、あなたも持っている必要があります:
[ms release];
[ms2 release];
編集:「自分」対象とするとき、あなたがいない
方法を知っていますか?あなたが単語「new
」で始まるメソッドを介してオブジェクトを取得する場合は、単語「alloc
」または...
- か:それはかなり簡単です...
- あなたが明示的に「
retain
」オブジェクト
ちょうど覚えている場合は、単語「copy
」または...
release
またはautorelease
を呼び出してその所有権を放棄しなければなりません。 これは、すべてMemory Management Programming Guideに明白に配置されています。
- 新しい可変文字列MSは、あなたは(あなたは「ALLOC」、それはあなたがそれを所有している場合*)ので、それは
- 同じ(と「自動解放」されていない)1の保持カウントで始まる所有していることを作成されます
- ms2はNSValueのswでラップされますが、swはms2(valueWithNonRetainedObject)を保持しないため、ms2の保持カウントは増加しません
- msとswが可変配列aに追加されます。
*)を参照してください、それが配列の要素ではないのでしかしMS2のカウントを保持していない(ただし、NSValue SWの) - 配列は常にザが1だけ増加され、MSとSWのカウントを保持するので、その要素を保持しますthe memory management rules
- 1. 誰も私にこのコードを説明できますか?
- 2. 誰も私にこのコードを説明できますか?
- 3. Javascript:誰も私にこのコードブロックを説明できますか?
- 4. 誰も私にこのMATLABコードを説明できますか?
- 5. 誰でもこのスクリプトのことを私に説明することはできますか?
- 6. Symfony2とAngularJS。誰も私を説明することはできますか?
- 7. 誰でも私のコードをcで説明することができます
- 8. これはマルチモードで802.3のことを誰でも説明できますか?
- 9. 誰でもこのコードを説明できますか?
- 10. C誰でもこの構文を説明できますか?
- 11. 誰かが私にこのコードを説明できますか?
- 12. 誰かが私にこのエラーを説明できますか?
- 13. 誰かが私にこのバッチファイルを説明できますか?
- 14. 誰でも私に説明することができますStandardScaler?
- 15. 誰もがこのプログラムを説明できますか?
- 16. 誰もこのMySQLエラーを説明できますか?
- 17. 誰もこのC++のループを私のために説明できますか?
- 18. 誰も私にこのクイックソートの例を説明できますか?
- 19. 誰もこのopencvコードの一部を私に説明できますか?
- 20. 誰もこのコードを私に説明してもらえますか?
- 21. 誰でもこの意味を説明できます
- 22. 誰もこの文脈自由文法を私に説明できますか?
- 23. 誰でもこのコードについて説明できますか?
- 24. 誰もこの分解を明確に説明できますか?
- 25. 誰かがこのsedコマンドを私に説明してもらえますか?
- 26. 誰かこのプログラムを私に説明してもらえますか?
- 27. 誰かがこのデコレータコードを私に説明してもらえますか?
- 28. 誰かがこのRegExについて私に説明できますか?
- 29. 誰かが "for loop"を私に説明することはできますか?
- 30. 誰も私にこのPHPコードインジェクション攻撃を説明することはできますか?
はここにあなたのデイブありがとうそれはいくつかの奇妙な出力 –
を示した理由出力は今、私は、これはそれが出力で2011年4月21日10たことを意味しないものを理解して:35:31.765 retaincountpgm [399:903] *** __NSAutoreleaseNoPool ():NSConcreteValueクラスのオブジェクト0x100110580が、プールなしで自動リースされました。ただ漏れました。 2011-04-21 10:35:31.766 retaincountpgm [399:903] *** __NSAutoreleaseNoPool():NSCFArrayクラスのプールなしでオブジェクトが0x100110ce0になりましたインプレース - jそれが言うだけで –
@toddlerを漏出しています。あなたはおそらく 'main'でこれを実行しており、' NSAutoreleasePool'を作成していません。 –