2012-08-28 6 views
1

Я оберточной AVAudioPlayer с очень простым классом, который позволяет мне определить и URL и сразу играть, а затем вызвать завершение блок, как это:Как сохранить сильную ссылку?

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

Причины, почему я написал это, потому что это очень легко, просто. Нет необходимости реализовывать делегат и т. Д. Проблема в том, что это не сработает. Выполнение этого в функции, очевидно, выделит его на стек, и оно скоро будет отменено, в результате звук перестанет играть.

Итак, что является лучшим способом реализации такого типа обертки, чтобы сохранить ссылку до тех пор, пока звук не будет закончен? Спасибо

ответ

-1

Я не уверен, насколько это возможно, используя ARC, поскольку вы не можете управлять циклами сохранения/освобождения. Я сделал что-то подобное этому, используя обертку для UIAlertView, и то, что я сделал - не используя ARC, конечно, было бы просто вызвать [self retain] в классе-оболочке во время метода show, а затем, когда делегат метод вызывается в обертке, вызовите completionBlock, а затем [self release]. Это гарантирует (пока вы соблюдаете правила сохранения/выпуска!), Что класс-оболочка будет жив, по крайней мере, до тех пор, пока не будет вызван обратный вызов, и в обычном случае оболочка сама покончит с собой, когда это будет сделано. Опять же, поскольку вы не можете управлять циклами сохранения с помощью ARC, я не уверен, что это сработает.

Альтернативой для вас может быть просто подклассификация AVAudioPlayer или создание ее категории, установив для себя делегат. Возможно, он сможет сохранить его достаточно долго, чтобы он сохранялся до полного воспроизведения звука, хотя я немного расплывчатый в том, как работает ARC.

Удачи!

0

У вас не должно возникнуть проблемы. Что заставляет вас думать, что он «явно выделит его на стек, и он скоро будет выделен»? Ты это пробовал? Очевидно, у вас нет четкого представления о том, как работает управление памятью в Objective-C.

В вашей реализации playAudioWithURL:urlcompletionBlock: у вас неизбежно будет какая-то асинхронная отправка. Эта отправка неизбежно должна будет сохранить ваш объект аудиоплеера, чтобы он воспроизводил материал. Так что нет, он не будет освобожден, если вы не сделаете что-то неправильно.

Смежные вопросы