我正在爲iPod播放器控制器使用音樂播放器屬性。MPMusicPlayerController:當iPod App在後臺終止時,iPod停止發送通知
// .h
@property (nonatomic, retain) MPMusicPlayerController *ipodPlayer;
// .m
ipodPlayer = [MPMusicPlayerController iPodMusicPlayer];
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter addObserver:self selector:@selector(changedPlaybackState:) name:MPMusicPlayerControllerPlaybackStateDidChangeNotification object:ipodPlayer];
[notificationCenter addObserver:self selector:@selector(changedNowPlayingItem:) name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification object:ipodPlayer];
[ipodPlayer beginGeneratingPlaybackNotifications];
在後臺處理,如果iPod播放器的應用程序被終止,控制檯打印出:
MediaPlayer: Message playbackState timed out.
如果它不會崩潰(或結冰,會降低性能),通知不被髮送到我的觀察方法了。我仍然可以發送郵件一樣:
[ipodPlayer pause];
[ipodPlayer play];
[ipodPlayer skipToNextItem];
[ipodPlayer skipToPreviousItem];
但不能收到任何通知
我的問題是:
- 的是,有辦法重新分配,在運行時加載的指針?我怎樣才能恢復財產爲,就像它首次推出時一樣?
- 我該如何抓住這個問題:「MediaPlayer:Message playbackState超時。」在控制檯輸出?這不像使用NSLog。
謝謝你幫助我。
更新: 好像使用assign
或weak
爲ipodPlayer財產的解決方案。此外,訪問它是假設該物業可能不在那裏。經過多次試用和一年的實際使用後,我認爲這是正確的解決方案。
您使用的是iOS 5嗎?如果沒有,那麼你應該這樣做: self.ipodPlayer = [MPMusicPlayerController ...] 否則在理論上,由iPodMusicPlayer創建的實例將被收集,並且您還沒有加入ref計數,因此您將得到一個空指針在某一點。除非您在每次與音樂播放器進行互動之前調用此方法,這可能是您遇到問題的另一個原因。一個實例被收集,你不會將自己附加到新的實例? – hktegner 2011-12-12 08:54:47
感謝您評論這篇舊文章。我改變了我的訪問這個ipodPlayer屬性的流程,因爲它可能不存在。所以,我讓屬性使用'assign'或'weak',並用'[MPMusicPlayerController iPodMusicPlayer];'將其初始化;'只要它不存在 – petershine 2011-12-13 01:49:58