1

次のように、AVAudioPlayer を非常に単純なクラスでラップしています。これにより、URL を指定してすぐに再生し、完了ブロックを呼び出すことができます。

[AudioPlayer playAudioWithURL:url
                  completionBlock:^{
                      //finished playing
                  }];

これを書いた理由は、とても簡単でシンプルだからです。デリゲートなどを実装する必要はありません...問題は、これが機能しないことです。関数でこれを行うと、明らかにスタックに割り当てられ、すぐに割り当てが解除され、サウンドの再生が停止します。

では、この種のラッパーを実装して、サウンドの再生が終了するまで参照を維持する最良の方法は何でしょうか? ありがとう

4

2 に答える 2

0

問題ないはずです。「明らかにスタックに割り当てられ、まもなく割り当てが解除される」と思われる理由は何ですか。試しましたか?あなたは明らかにObjective-Cのメモリ管理がどのように機能するかをよく理解していません。

の実装ではplayAudioWithURL:urlcompletionBlock:、必然的にある種の非同期ディスパッチが発生します。このディスパッチでは、オーディオプレーヤーオブジェクトを再生させるために、必然的にオブジェクトを保持する必要があります。ですから、何か間違ったことをしない限り、割り当てが解除されることはありません。

于 2012-11-21T08:37:46.220 に答える
-1

保持/解放サイクルを実際に管理することはできないため、これがARCを使用してどの程度可能かはわかりません。のラッパーを使用してこれと同様のことをUIAlertView行いました。もちろん、ARCを使用せず[self retain]に、メソッドの実行中にラッパークラスを呼び出しshow、次にデリゲートメソッドが呼び出されたときに実行しました。ラッパーで、を呼び出してcompletionBlockからを呼び出します[self release]。これにより、(保持/解放ルールに従っている限り)ラッパークラスが少なくともコールバックが呼び出されるまで存続し、通常の場合、ラッパーはジョブの実行が完了すると自殺することが保証されます。繰り返しになりますが、ARCを使用して保持サイクルを管理することはできないため、これが機能するかどうかはわかりません。

別の方法としては、単にサブクラス化するAVAudioPlayerか、カテゴリバージョンを作成して、デリゲートをそれ自体に設定することを検討することもできます。それは、完全なサウンドが再生されるまでそれが持続するのに十分長くそれを存続させることができるかもしれません-私はARCがどのように機能するかについて少し曖昧ですが。

頑張ってください!

于 2012-08-28T12:40:56.223 に答える