2011-01-10 8 views
2

私はクラスAudioManagerのメンバーがAudioBufferList *であります。 (これはCoreAudioフレームワークで宣言された構造体です)。 AudioBufferListNSObjectではないので、私はそれを保持することができませんので、私はそれを解放しなければなりません(私が間違っていれば私を修正してください)。Objective-Cオブジェクトでmalloc/freeを使用

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

編集:リンゴのドキュメントから

サブクラスは、オブジェクトなど 動的に割り当てられたストレージなどで消費される任意の追加メモリ の 放出を可能にするためにdeallocの独自の のバージョンを実装する必要がありますデータ または割り当て解除されたオブジェクト が所有するオブジェクトインスタンス変数。 - しかし、より多くの洞察力が高く評価されて

物事は少し明確になります: はクラス固有の 割り当て解除を実行した後、サブクラスのメソッド は、スーパーへのメッセージを通じて、スーパークラスのバージョンにのdeallocの を組み込む必要があります。

答えて

1

はい、あなたは/ malloc関数に必要なメモリを解放します。偉大な答え/例がここにあります、適切なメモリ管理が含まれる:

については

iPhone: AudioBufferList init and release

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

重要な点は1つありますが、誤って誤って入力したことがあります:は、releaseがオブジェクトに送信されたときに呼び出されません。 NSObjectのインスタンスは、保持カウントがゼロに達したときにのみ割り当て解除されます。オブジェクトの保持カウントはであり、送信後はとなります。しかし、で、deallocというメッセージが送信されます。これは、他のオブジェクトがそのインスタンスを「所有している」ことを意味し、割り当てられた状態を維持するためにオブジェクトに依存していることを意味します。

+0

まあ、別のアドレスを指すポインタを割り当てる前にfree()する必要があることを完全に明確にしています...説明をありがとう。 –

0

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

、自動的releaseメッセージが送信されるときに保持カウントが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; 
} 
+0

しかし、非オブジェクト型( 'AudioBufferList'など)はまだ 'c-style'のmalloc/freeである必要がありますか?つまり、動的にメモリを割り当てる必要があることがあります。 (あなたのコメントの2番目の部分に感謝します)。 –

+0

明確ではないAudioBufferListについて特別なことがない限り、いいえ。たとえば、アップルの方法、CGRectMakeを見てください。これは、私の答えの編集で投稿します。 – GendoIkari

+0

もちろん、あなたのデータ型のコピーだけを返したいならば。しかし、実行時にしか知り得ないサイズの 'CGRect'の配列を作成しなければならない場合はどうなりますか?次に、私が知る限り、動的にメモリを割り当てる必要があります。 –

関連する問題