Ios5 iOS 5已释放AVPlayerItem的一个实例

Ios5 iOS 5已释放AVPlayerItem的一个实例,ios5,mpmovieplayercontroller,Ios5,Mpmovieplayercontroller,当我尝试从我的iPhone(位于documentsDirectory)播放视频时,我在使用iOS 5时遇到以下错误,而iOS 4.3运行正常: AVPlayerItem类的实例0x168da0已解除分配,而键值观察员仍在该实例中注册。观测信息被泄露,甚至可能被错误地附加到其他物体上。在NSKVODeallocateBreak上设置断点,使其在调试器中停止。以下是当前的观察信息: ( 上下文:0x0,属性:0x10b570> 上下文:0x0,属性:0x117ab0> 以下是代码摘录: MPMovi

当我尝试从我的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];

我以前也犯过同样的错误,当视图消失时,只需移除观察者即可清除泄漏

willwilldesign
dealloc

编辑:中,在发布下面的答案后,我注意到每当重新分配控制器时,错误都会回来,因为旧控制器会自动重新分配,即使我自己完全没有设置通知处理程序。因为失败来自代码I在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方法都应该在设置新的电影控制器之前正确地解除分配旧的电影控制器(如果有)


作为脚注,如果在
MPMoviePlayerPlayerPlaybackDidFinishNotification
通知处理程序中手动(假设)dealloc/'unreference'(设置为nil)属性,则您可能会注意到错误再次出现。因此不要这样做:-)

啊。你是从一个SomethingElse对象观察TekPoint对象,而SomethingElse对象就是添加和删除观察者的对象,对吗?(这是正常的操作方式;我只是想澄清一下。)

看起来您的TekPoint对象正在解除分配,而观察它的SomethingElse仍然存在。不会调用SomethingElse dealloc方法,因为解除分配的是TekPoint,而不是SomethingElse


如果你计划观察一个可能在观察者消失之前消失的对象,那么你需要某种方式通知观察者他们应该移除他们的观察者。你的TekPoint可能有一个活动属性,SomethingElse也会观察到它,当它被设置为“否”时,所有观察TekPoint的人都会看到它你可以把自己作为观察者删除。

NSNotificationCenter!=KVO。你混合了两种完全不同的技术。他问的是关于
MPMoviePlayerPlaybackDidFinishNotification
这不是KVowill会消失吗?你的意思是Viewwill消失吗?:)以上问题的答案错误。请仔细阅读问题这是一个老生常谈的问题,但为了防止任何人有同样的问题,MPMoviePlayerController似乎不喜欢某些NSURL,即使它们被视为有效对象。“秘密”是将文件路径获取为NSString,然后使用
[NSURL fileURLWithPath:URLStringPath]
创建用于创建
MPMoviePlayerController
实例的URL。您为我节省了大量时间。很好的研究工作。我在拔头发。
@interface MyClass
@property ( strong, nonatomic ) MPMoviePlayerViewController * movieController;
@end

@@implementation MyClass
@synthesize movieController = _movieController;

// ...then later, this:
//
// MPMoviePlayerController *moviePlayerController = [...];
//
// ...becomes:

self.movieController = [...];