0

リリース直前のdeallocメソッドでオブジェクトの保持(参照)カウントが1より大きい場合、これはメモリリークが発生することを意味しますか?

別の問題を見つけるためにコードをデバッグしていましたが、この微妙な問題に遭遇しました。私のオブジェクトの保持カウントの1つは、deallocメソッドで3でした。このオブジェクトはretainを持つプロパティであり、クラス内でのみ呼び出されます。ここで、解放する前に、deallocメソッドのすべてのオブジェクトの保持カウントを1にする必要があると思いますか?

カスタムクラスのdeallocメソッドの例を次に示します。

- (void)dealloc {
    // Prints: "myObject retaincount: 3"
    NSLog(@"myObject retaincount: %d", [myObject retainCount]);

    // myObject retain count will be 2 after this call
    [myObject release];

    [super dealloc];
}

これは正常ですか?

4

3 に答える 3

6

Appleから-retainCount

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

于 2010-06-23T22:58:48.337 に答える
2

IfmyObjectは、次のようにメソッド(たとえば、「method:」)を介して他のオブジェクト(たとえば、「anObj」)に渡されます。

 [anObj method:myObject];

anObj必要に応じて保持myObjectできます。deallocその場合、を含むオブジェクトmyObjectが呼び出されたときに、の保持カウントがmyObject1より大きいことは完全に合理的です。

あなたのコードはまだ大丈夫です:それが終わったとき、それを含むオブジェクトの責任はrelease所有権にあります。後[myObject release]myObject割り当てが解除されません。代わりに、リリース時に割り当てがanObj解除されます。

于 2010-06-23T16:26:20.317 に答える
0

保持カウントを出力する代わりに、参照カウントをオンにして、コードに対してObjectAlloc Instrumentを実行します(機器の(i)をクリックして、アプリの記録を行う機器を再起動します)。

次に、オブジェクトの特定のインスタンスに移動して、そのオブジェクトの完全な保持/解放履歴を取得できます。これは、あるべきではないオブジェクトを保持しているかどうかを判断するのに役立ちます。

もう1つの簡単なチェックは、ブレークポイントを設定するか、myObjectのクラスのdeallocにログを記録して、オブジェクトが予期したときに割り当て解除されているかどうかを直接確認できるようにすることです。そこにありますが、自動解放プールが空になると、それはなくなります。

于 2010-06-24T04:56:18.640 に答える