【发布时间】:2010-08-21 19:46:25
【问题描述】:
我正在为 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:消息播放状态超时。”在控制台输出中? 这不像使用 NSLog。
谢谢你帮助我。
更新:
似乎为 ipodPlayer 属性使用assign 或weak 是解决方案。此外,访问它是在假设该属性可能不存在的情况下完成的。经过多次试验和一年在我的应用中实际使用它,我认为这是正确的解决方案。
【问题讨论】:
-
您使用的是 iOS 5 吗?如果没有,那么你应该这样做: self.ipodPlayer = [MPMusicPlayerController ...] 否则理论上 iPodMusicPlayer 创建的实例将被收集并且你没有增加引用计数,所以你会在某个时候得到一个空指针。除非您在每次与音乐播放器交互之前调用该方法,这可能是您出现问题的另一个原因。收集了一个实例,而您没有将自己附加到新实例?
-
感谢您评论这篇旧帖。我改变了访问这个 ipodPlayer 属性的流程,因为它可能不存在。因此,我将属性设置为使用
assign或weak,并在它不存在时使用[MPMusicPlayerController iPodMusicPlayer];对其进行初始化
标签: crash background notifications ios mpmusicplayercontroller