Iphone MPMoviePlayerController将播放一次,然后抛出一个错误

Iphone MPMoviePlayerController将播放一次,然后抛出一个错误,iphone,mpmovieplayercontroller,Iphone,Mpmovieplayercontroller,我意识到以前也有人提出过类似的问题,但我似乎真的找不到适合我的解决方案。我有一个MoviePlayer类,它存储MPMoviePlayerController的ivar,我在类中有以下方法: -(void)playMovie:(NSString *)movieName { NSURL *movieURL; NSBundle *bundle = [NSBundle mainBundle]; if(bundle) { NSString *moviePa

我意识到以前也有人提出过类似的问题,但我似乎真的找不到适合我的解决方案。我有一个MoviePlayer类,它存储MPMoviePlayerController的ivar,我在类中有以下方法:

-(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方法。在该方法中放置一个断点,并找出调用它的时间。