当我尝试从我的iPhone(位于documentsDirectory中)播放视频时,使用iOS 5时出现以下错误,而iOS 4.3正常工作:
类AVPlayerItem的实例0x168da0已取消分配,而键值观察者仍在其中注册。观察信息被泄露,甚至可能被错误地附加到其他物体上。在NSKVODeallocateBreak上设置断点以在调试器中停止。这是目前的观察信息: ( 上下文:0x0,属性:0x10b570> 上下文:0x0,属性:0x117ab0>
以下是代码提取:
MPMoviePlayerController *moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:[appDelegate.mediaManager loadVideo:[element valueForAttributeNamed:@"value"]]];
//create a NSNotificationCenter which call moviePlaybackComplete function when video playback finished
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlaybackComplete:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayerController];
//display the moviePlayer view
[self.view addSubview:moviePlayerController.view];
moviePlayerController.fullscreen = YES;
[moviePlayerController play];
答案 0 :(得分:13)
编辑:在发布下面的答案之后,我注意到每当重新分配控制器时,错误会在旧控制器自动解除分配时返回,即使我设置了绝对没有通知处理者自己。由于失败来自MP框架内的代码,我想说这似乎是一个操作系统错误。
我在使用ARC的基于故事板的iOS 5项目中遇到了同样的问题。问题是在堆栈上使用临时变量来引用电影控制器 - 在我的例子中,我假设与ARC进行了交互,但它可能比这更基本。在任何情况下,看起来好像某些东西过早地被释放/丢失(例如,当发生播放错误时)并且日志被您描述的那种输出填充。
将影片控制器引用存储在拥有类中定义的属性中解决了这个问题;即:
@interface MyClass
@property ( strong, nonatomic ) MPMoviePlayerViewController * movieController;
@end
@@implementation MyClass
@synthesize movieController = _movieController;
// ...then later, this:
//
// MPMoviePlayerController *moviePlayerController = [...];
//
// ...becomes:
self.movieController = [...];
如果您正在使用属性的合成访问器,那么无论您是使用手动还是自动引用计数,生成的setter方法都应该在设置新的电影控制器之前正确地解除分配旧电影控制器(如果有)。
作为脚注,如果你在MPMoviePlayerPlaybackDidFinishNotification
通知处理程序中手动(例如)dealloc /'unreference'(set-to-nil)属性,那么你可能会注意到错误会再次出现。所以不要这样做: - )
答案 1 :(得分:0)
阿。您正在从SomethingElse对象观察TekkPoint对象,而SomethingElse对象是添加和删除观察者的对象,对吗? (这是正常的事情;我只是想弄清楚。)
看起来你的TekkPoint对象正在被解除分配,而正在观察它的SomethingElse仍然存在。不调用SomethingElse dealloc方法,因为它是被释放的TekkPoint,而不是SomethingElse。
如果您计划在观察者消失之前观察可能消失的物体,那么您需要某种方式通知观察者他们应该移除他们的观察者。您的TekkPoint可能具有一个存活属性,也可以通过SomethingElse观察到,当它被设置为NO时,观察TekkPoint的每个人都将以观察者身份移除它们。
答案 2 :(得分:-5)
之前我遇到过同样的错误,当视图消失时,只需删除观察者即可清除泄漏。
把
[[NSNotificationCenter defaultCenter] removeObserver:self];
<{1>}或willWillDisappear
中的