2011-06-23 11 views
8

私はいくつかのサウンドを再生するAVAudioPlayerのインスタンスを持っています。 AVAudioPlayerインスタンスに新しいサウンドを提供する方法はありますか、initWithDataを使用して新しいインスタンスを作成する必要がありますか:別のサウンド用のAVAudioPlayerの再利用

答えて

1

通常、オブジェクトを再利用するのは悪い考えです。通常、オブジェクトをできるだけ短命にするようにしてください。これにより、コードの可能な状態の数が減り、それについての推論が容易になります。 ( "この値はどこから来たのでしょうか?以前のインスタンスの使用状況から残っているかもしれませんか?" Yuck。)測定可能な問題に遭遇した後でのみ、このルールを破ります。

この考え方に沿ってさらに読むには、questions tagged “immutable”を参照してください。

+13

これは@Fernandoの質問に対する答えではなく、一般化されすぎています。オブジェクトの再利用が新しいオブジェクトの作成より優れたアプローチである多くのコンテキストがあります。 –

+1

私はクリストファーが正しいと思います。パフォーマンス上の理由からです。たとえば、テーブルビューは既存のセルを再利用し、Appleは明示的にそれを推奨します。少なくともクリストファーがしたように、あなたはポスターの質問に「ファイルを変更する方法はありません」と答えました。 –

+0

テーブルビューはハードパフォーマンス要件(スクロール)を満たす必要があるため、特別なケースです。しかし、一般的に、新しいオブジェクト構築のパフォーマンスコストは今日かなり低く、パフォーマンス問題になるまでオブジェクトを再利用することは悪い考えです。 – zoul

19

既存のAVAudioPlayerインスタンスに新しいファイルを渡すAPIはありません。しかし、AVAudioPlayerの作成は高価ではないので、完了後にインスタンスをリリースすれば、パフォーマンスは気にする必要はありません。

お互いに再生される、または繰り返し再生される可能性のある固定サウンドセットがある場合は、適切なインスタンスでplayを呼び出すことによって、各サウンドごとに1つのAVAudioPlayerインスタンスを作成して再利用できます。

一度に1つのサウンドだけが再生され、新しいサウンドが生成されている場合(たとえば、ユーザーの入力に基づくテキスト読み上げの場合)、通常は1つのプレーヤーがプロパティとして使用されます。新しいサウンドが再生されると、私は[player stop]に電話し、古いプレーヤーを解放し、新しいサウンドファイルで新しいものをインスタンス化します。

+2

ええ、私はこの質問をGoogleで検索しました。新しいAVAudioPlayerをたくさん作成するとパフォーマンスが低下すると考えたからです。あなたの答えはすぐに私の質問を解決します。 1)AVAudioPlayerのファイルを変更する方法がない2)AVAudioPlayerを作成するのは高価ではありません。 –

+0

これは受け入れられた答えでなければなりません。 – Herm

+0

ARCの提案はありますか? – piperchester

関連する問題