2012-08-28 42 views
1

我包裹AVAudioPlayer有一個非常簡單的類,它可以讓我指定和網址,並立即播放,然後調用完成塊,像這樣:如何保持強有力的參考?

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

我之所以寫這是因爲它很容易,簡單。沒有必要實施委託,等等......問題是,這是行不通的。在一個函數中這樣做顯然會將它分配到堆棧上,並且它很快就會被取消分配,導致聲音停止播放。

那麼,實現這種包裝的最好方法是什麼?爲了保持參考,直到聲音播放完畢? 謝謝

回答

-1

我不知道這將使用ARC有多可能,因爲你不能真正管理保留/釋放週期。我使用UIAlertView的包裝器做了類似這樣的事情,我做了什麼 - 當然不使用ARC - 只需在show方法期間在包裝類上調用[self retain],然後在代理方法在包裝器上調用,調用completionBlock,然後[self release]。這可以保證(只要你遵循保留/釋放規則!)包裝類至少在調用回調之前是活着的,通常情況下,包裝器在完成它的工作後會自殺。同樣,由於您無法使用ARC管理保留週期,因此我不確定這是否可行。

您的替代方案可能是簡單地將子類AVAudioPlayer或創建它的類別版本,將代理設置爲自身。這可能會讓它保持足夠長的時間,直到完整的聲音播放 - 儘管我對ARC的工作原理有點模糊。

祝你好運!

0

你不應該有任何問題。是什麼讓你覺得它「很明顯會將它分配給堆棧,並且很快就會被取消分配」?你試過了嗎?您顯然不瞭解Objective-C中的內存管理是如何工作的。

在您實施playAudioWithURL:urlcompletionBlock:時,您將不可避免地會有某種異步調度。這個發送將不可避免地保留你的音頻播放器對象,以便讓它播放內容。所以不,它不會被釋放,除非你做錯了什麼。