Iphone MPMoviePlayerController将播放一次,然后抛出一个错误
我意识到以前也有人提出过类似的问题,但我似乎真的找不到适合我的解决方案。我有一个MoviePlayer类,它存储MPMoviePlayerController的ivar,我在类中有以下方法:Iphone MPMoviePlayerController将播放一次,然后抛出一个错误,iphone,mpmovieplayercontroller,Iphone,Mpmovieplayercontroller,我意识到以前也有人提出过类似的问题,但我似乎真的找不到适合我的解决方案。我有一个MoviePlayer类,它存储MPMoviePlayerController的ivar,我在类中有以下方法: -(void)playMovie:(NSString *)movieName { NSURL *movieURL; NSBundle *bundle = [NSBundle mainBundle]; if(bundle) { NSString *moviePa
-(void)playMovie:(NSString *)movieName
{
NSURL *movieURL;
NSBundle *bundle = [NSBundle mainBundle];
if(bundle)
{
NSString *moviePath = [bundle pathForResource:movieName ofType:@"m4v"];
if(moviePath)
{
movieURL = [NSURL fileURLWithPath:moviePath];
}
}
MPMovieController *mp = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
if(mp)
{
self.moviePlayer = mp;
[mp release];
[self.moviePlayer play];
}
[movieURL release];
}
调用时,电影播放正常后我播放电影,但在不同(或相同)电影文件上再次调用时,我会得到以下错误堆栈:
_class_isInitialized
_class_lookupMethodAndLoadCache objc_msgSend
-[MoviePlayer setMoviePlayer:]
-[MoviePlayer playMovie:]
我不知道怎么修理它!我假设当self.moviePlayer=mp被调用时,当前的moviePlayer被释放,新的moviePlayer被添加?该属性设置为(非原子,保留)。有人能帮忙吗
谢谢你发布了电影播放器。因此,它已被解除分配 看起来您已经在代码的其他地方发布了它,可能是在回调方法中。只要看看你用过的每一个例子 电影播放器现在指向垃圾。因此,当您尝试创建新的moviePlayer时,您的属性访问器会尝试向moviePlayer中存储的垃圾发送释放消息 如果您想在使用之间取消分配moviePlayer,请不要取消分配,而是将其设置为nil
[self setMoviePlayer:nil];
然后,当您尝试创建一个时,您将不会向垃圾发送消息。我已修复此问题。结果发现问题出在这段代码上: movieURL=[NSURL fileURLWithPath:moviePath] 由于某种原因,NSURL被自动释放得太早了。如果我为此分配内存并自己释放,那么问题就不会发生了 希望这能帮助其他人
斯图嘿,谢谢你的回复。我尝试了您的建议,并在中使用NSPOPUTORELEASEPOOL>[MPMoviePlayer CONTROLLELOC]方法得到了一个错误堆栈。我从来没有在我的代码中自动释放MPMoviePlayerController,我已经检查了每一行只是为了再次检查它。MPMoviePlayerController是否自动添加到池中?如果您有堆栈,那么您应该可以看到电影播放器的发布位置(希望如此)。不,您使用了init,所以您有责任释放它(cocoa内存管理)。你必须在释放玩家时追踪。您还可以为MPMoviePlayer创建一个类别,然后实现release方法。在该方法中放置一个断点,并找出调用它的时间。