2

AudioManagerタイプのメンバーを持つクラスがありAudioBufferList *ます。(これはCoreAudioフレームワークで宣言された構造体です)。AudioBufferListではないのでNSObject、保持できません。そのため、割り当て/解放する必要があります(間違っている場合は修正してください)。

私の質問は、それを解放するための「正しい」場所はどこにあるのかということです。dealloc現在、の方法でやっていAudioManagerます。私が正しく理解していれば、メッセージが---releaseのインスタンスに送信されると、このメソッドは自動的に呼び出されます。それは本当ですか?AudioManagerObjective-Cオブジェクトの非オブジェクトメンバーでalloc/freeを使用することに関して他に推奨される方法はありますか?

編集:

Applesのドキュメントから:

サブクラスは、独自のバージョンのdeallocを実装して、オブジェクトによって消費される追加のメモリを解放できるようにする必要があります。たとえば、データ用に動的に割り当てられたストレージや、割り当て解除されたオブジェクトが所有するオブジェクトインスタンス変数などです。クラス固有の割り当て解除を実行した後、サブクラスメソッドは、次のメッセージを介してスーパークラスバージョンのdeallocを組み込む必要があります。

これにより、状況が少し明確になりますが、より多くの洞察が得られます。

4

2 に答える 2

1

はい、メモリをmalloc/解放する必要があります。ここに素晴らしい答え/例があり、適切なメモリ管理が含まれています:

iPhone:AudioBufferListの初期化とリリース

「いつ」については、AudioManagerがリリースされたときにメモリを解放するだけでなく、AudioBufferListの値が変更された場合にも解放する必要があります。例えば。ポインタが最初にAudioBufferList構造体の「インスタンスA」を参照していて、AudioBufferList構造体の「インスタンスB」を指すように変更した場合は、「インスタンスA」のメモリを解放する必要があります。それ以外の場合は、失われる可能性があります。(そして、メモリがリークされます。)

重要なポイントの1つであり、おそらくそれはあなたが知っていたものの、誤ってタイプミスしたものです。オブジェクトに送信されたdeallocときに呼び出されません。releaseNSObjectのインスタンスは、保持カウントがゼロに達したときにのみ割り当てが解除されます。オブジェクトの保持カウントは2である可能性があり、送信後[myObject release]、その保持カウントは1になります。ただし、メッセージは送信されませんdealloc。これは、他のオブジェクトがまだそのインスタンスを「所有」しており、割り当てられて使用可能な状態を維持するためにオブジェクトに依存していることを意味します。

于 2011-01-10T19:49:40.203 に答える
0

mallocを実行したり、解放したりする必要はありません。intまたはdoubleを使用するのと同じ方法で、CGRectやAudioBufferListなどの構造体を使用します。非オブジェクトタイプのretain、alloc、dealloc、releaseなどに問題はありません。

deallocメソッドはAudioManagerreleaseメッセージ送信時に自動的に呼び出されるのではなく、保持カウントが0のときに自動的に呼び出さreleaseれます。オブジェクトにメッセージを送信すると、保持カウントが1減少します。それを保持します。その場合、まだ割り当てが解除されません。

編集

Appleが構造体タイプを使用する方法の例:

CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)
{
  CGRect rect;
  rect.origin.x = x; rect.origin.y = y;
  rect.size.width = width; rect.size.height = height;
  return rect;
}
于 2011-01-10T19:04:10.030 に答える