【问题标题】:MPMoviePlayerController will play once, then throw an errorMPMoviePlayerController 会播放一次,然后抛出错误
【发布时间】:2009-08-13 01:25:26
【问题描述】:

我意识到以前曾发布过类似的问题,但我似乎真的找不到适合我的解决方案。我有一个存储 MPMoviePlayerController 的 ivar 的 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被释放并添加了新的?该属性设置为(非原子,保留)。有人可以帮忙吗?

谢谢

【问题讨论】:

    标签: iphone mpmovieplayercontroller


    【解决方案1】:

    您已发布电影播放器​​。所以它已经被释放了。

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

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

    如果你想在两次使用之间释放moviePlayer,不要释放它,而是将它设置为nil。

    [self setMoviePlayer:nil];
    

    然后,当您尝试创建一个时,您将不会向垃圾发送消息。

    【讨论】:

    • 您好,谢谢您的回复。我已经尝试了您的建议,但使用 NSPopAutoreleasePool > [MPMoviePlayer Controller dealloc] 方法得到了一个错误堆栈。我从未在我的代码中自动释放 MPMoviePlayerController,我已经通过每一行来仔细检查它。 MPMoviePlayerControllers 会自动添加到池中吗?
    • 如果您有堆栈,那么您应该看到电影播放器​​的发布位置(希望如此)。不,您使用了 init,因此您有责任释放它(可可内存管理)。您必须在释放播放器时进行追踪。您也可以为 MPMoviePlayer 创建一个类别,然后实现发布方法。在该方法中放置一个断点并找出它何时被调用。
    【解决方案2】:

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

    movieURL = [NSURL fileURLWithPath:moviePath];

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

    希望这对其他人有所帮助。

    学习

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多