我意识到之前已经发布了类似的问题,但我似乎无法找到适合我的解决方案。我有一个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并添加新的?该属性设置为(非原子,保留)。有人可以帮忙吗?
由于
答案 0 :(得分:1)
您已发布电影播放器。所以它已被解除分配。
似乎你已经在代码中的其他地方发布了它,可能是在回调方法中。只需查看您使用它的每个实例。
moviePlayer现在指向垃圾。因此,当您尝试创建新的moviePlayer时,您的属性访问者会尝试向存储在moviePlayer中的垃圾发送一条释放消息。
如果要在使用之间取消分配moviePlayer,请不要取消分配,而是将其设置为nil。
[self setMoviePlayer:nil];
然后当你尝试创建一个时,你就不会发送消息了。
答案 1 :(得分:1)
我解决了这个问题。原来这个代码就是问题所在:
movieURL = [NSURL fileURLWithPath:moviePath];
由于某种原因,NSURL过早被自动释放。如果我为此分配内存并自行发布,那么问题就会停止发生。
希望这有助于其他人。
斯图