1

今、私はを持っていますClassA : NSObject、そして次にviewcontrollerviewDidLoadで、以下のコードを見てください:

- (void)viewDidLoad {
    ClassA *a = [[ClassA alloc] init];
    NSLog(@"a retainCount = %d", [a retainCount]);
    ClassA *b = a;
    NSLog(@"a retainCount = %d b retainCount= %d ", [a retainCount],[b retainCount]);
    [a release];
    NSLog(@"a retainCount = %d b retainCount= %d", [a retainCount],[b retainCount]);
    [super viewDidLoad];
}

コンソール出力は次のようになります。

2012-11-02 14:43:35.437 RetainCountTest[1043:207] a retainCount = 1
2012-11-02 14:43:35.439 RetainCountTest[1043:207] a retainCount = 1 b retainCount= 1  
2012-11-02 14:43:35.439 RetainCountTest[1043:207] a retainCount = 1 b retainCount= 1

電話したときに[a release]、なぜ[a retainCount]== 1?</ p>

4

3 に答える 3

4

これは、「retainCountが役に立たない」ためです。

コンテキストを追加するには:「デッド」なオブジェクトにメッセージを送信するときは、未定義の動作を期待する必要があります。

于 2012-11-02T06:58:24.393 に答える
1

あなたはretainCountに注意を払うべきではありません。それらはせいぜい混乱し、最悪の場合誤解を招くものです。それらが保持/解放のメモリ管理ルールに正しく準拠していることを確認し、retainCountsを忘れる必要があります。

ドキュメントから..

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

編集:推奨読書

-retainCountを使用する場合

編集:OPのコメントを見た後

Cocoaコアメモリ管理ルールから

オブジェクトを作成またはコピーすると、その保持カウントは1になります。その後、他のオブジェクトがオブジェクトの所有権を表明し、保持カウントが増加します。オブジェクトの所有者は、オブジェクトの所有権を放棄することもできます。これにより、保持カウントが減少します。保持カウントがゼロになると、オブジェクトの割り当てが解除されます(破棄されます)。

これを読むと、彼/彼女は、ああ、retainCountは神聖であり、NSLogステートメントを使用するだけでオブジェクトの完全な割り当て/保持/リリースサイクルを見ることができると思うかもしれません。しかし、実際にはそのようには機能しません。あなたが作成したオブジェクトの唯一の所有権を持っていると言うことはできません。そのオブジェクトは、他のフレームワークオブジェクトによって保持される可能性があります。そして解放することによってあなたはあなたの所有権を放棄しているだけです。オブジェクトは、他のすべてのオブジェクトが参照を削除した後にのみ解放されます。

なぜパブリックAPIに残っているのかわかりません。

于 2012-11-02T06:58:15.473 に答える
1

[リリース]を呼び出すと、もう保持されていないため、割り当てが解除される可能性があります。その所有権は共有されているので、おそらくここに当てはまります。

それ以降のメッセージにaは未定義の戻り値があります。別のオブジェクトがのメモリスロットを再利用した可能性があります。

したがって、出力する戻り値は基本的にランダムです。アプリがクラッシュしたか、1000を印刷した可能性があります...

于 2012-11-02T17:37:17.750 に答える