0

私は何かを理解しようとしています。クラスAでは、クラスBのインスタンスを作成しています。このインスタンスは、Bには常に繰り返されるタイマーがあり、彼は記録と再生のシステムを永久に起動します。

クラスAでは、次のようにBのインスタンスを作成します。

recordMachine *recMinst=[[recordMachine alloc]init];
[recMinst startMachine];
[recMinst release];

つまり、classBには、プレーヤー、レコーダーポインター、その他の整数などのインスタンス変数がインターフェイスにあります。

問題は、Aでインスタンスをリリースした後、このclassBがどのように機能し続けるかということです。 AはすべてのBインスタンス変数を格納する場所をメモリ内に作成しません。それを解放すると、それらは消えますか?

4

3 に答える 3

1

Bインスタンスを最後まで保持する必要がある場合は、Aインスタンスが最後までAオブジェクトに保持する必要があります。あなたの場合、Bを解放した後の保持カウントは0であるため、割り当てが解除されます。

保管したい場合は、どこかに保管する必要があります。それを保持し、Aのdeallocメソッドでリリースすることをお勧めします

于 2012-06-11T12:24:32.803 に答える
0

AはすべてのBインスタンス変数を格納する場所をメモリ内に作成しません。それを解放すると、それらは消えますか?

はい、いいえ。リリースはC ++の削除のようには機能しません。たとえば、オブジェクトを削除してメモリをクリーンアップするのではなく、参照カウントを減らすだけです。別のオブジェクトがそのオブジェクトを保持している場合、その別のオブジェクトもそのオブジェクトのリリースを呼び出すまで、そのオブジェクトの割り当ては解除されません。

問題は、Aでインスタンスをリリースした後、このclassBがどのように機能し続けるかということです。

Bが機能し続ける理由についての唯一の説明は、他のオブジェクトがBを保持しているためです。

クラスBは、Bインスタンスを渡したはずのタイマー(ほとんどの場合NSTimer)を使用しているとのことです。したがって、NSTimerはBオブジェクトへの参照を保持し、それが破壊されるのを防ぎます。

インスタンスの参照カウントを確認してください。

NSTimerのドキュメントには、「ターゲットオブジェクトはタイマーによって保持され、タイマーが無効になると解放されます」と記載されています。

于 2012-06-11T12:34:48.833 に答える
0

Bのivarを手動で解放していない場合でも、-deallocそれらはまだメモリ内にあります。

于 2012-06-11T12:35:29.833 に答える