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

时间:2009-07-24 12:25:19

标签: iphone mpmovieplayercontroller

我意识到之前已经发布了类似的问题,但我似乎无法找到适合我的解决方案。我有一个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.movi​​ePlayer = mp时,释放当前的moviePlayer并添加新的?该属性设置为(非原子,保留)。有人可以帮忙吗?

由于

2 个答案:

答案 0 :(得分:1)

您已发布电影播放器​​。所以它已被解除分配。

似乎你已经在代码中的其他地方发布了它,可能是在回调方法中。只需查看您使用它的每个实例。

moviePlayer现在指向垃圾。因此,当您尝试创建新的moviePlayer时,您的属性访问者会尝试向存储在moviePlayer中的垃圾发送一条释放消息。

如果要在使用之间取消分配moviePlayer,请不要取消分配,而是将其设置为nil。

[self setMoviePlayer:nil];

然后当你尝试创建一个时,你就不会发送消息了。

答案 1 :(得分:1)

我解决了这个问题。原来这个代码就是问题所在:

movieURL = [NSURL fileURLWithPath:moviePath];

由于某种原因,NSURL过早被自动释放。如果我为此分配内存并自行发布,那么问题就会停止发生。

希望这有助于其他人。

斯图

相关问题