1

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

谢谢

4

2 回答 2

1

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

movieURL = [NSURL fileURLWithPath:moviePath];

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

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

斯图

于 2009-08-12T17:25:26.353 回答
1

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

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

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

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

[self setMoviePlayer:nil];

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

于 2009-07-24T14:40:29.203 回答