的MPMoviePlayerController将播放一次,然后抛出一个错误(MPMoviePlay

2019-10-17 03:06发布

我认识到,一个类似的问题之前已经公布,但我真的不能似乎找到了最适合我工作的解决方案。 我有其存储的MPMoviePlayerController的一个实例变量类MoviePlayer,以及我在类下面的方法:

-(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被释放,新添加? 该属性设置为(非原子,保留)。 有人能帮助吗?

谢谢

Answer 1:

您已经发布了电影播放器​​。 因此,它已释放。

看来你已经在你的代码的其他地方发布了它,可能是在回调方法。 只要看看你使用它的每一个实例。

moviePlayer现在指向垃圾。 所以,当您尝试创建一个新的moviePlayer,你的属性访问器试图发送一个释放消息存储在moviePlayer垃圾。

如果要解除使用之间moviePlayer,不释放它,而不是将其设为零。

[self setMoviePlayer:nil];

然后,当你尝试创建一个你不会被短信垃圾。



Answer 2:

我解决了这个问题。 原来这段代码是问题:

movieURL = [NSURL fileURLWithPath:moviePath];

该NSURL正在自动释放某种原因为时尚早。 如果我分配给该内存和释放它自己,那么问题停止发生。

希望这有助于其他人。

斯图



文章来源: MPMoviePlayerController will play once, then throw an error