你好!我正在写一个iPad应用程序,我需要能够在UIView加载时播放视频。但是,如果我在初始化之后尝试在任何地方向我的MPMoviePlayerController发送消息,那么我得到了一个BAD_EXC_ACCESS。我从我的* .h文件中删除了MPMediaPlayerController,然后完全在实现文件中声明它,现在我收到了代码下方底部的消息。构建和分析中没有关于内存泄漏(或任何问题)的问题,我找不到任何关于此的帖子。这是我的代码:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
NSString *url = [[NSBundle mainBundle] pathForResource:@"p0600c0100cmpintro" ofType:@"m4v"];
MPMoviePlayerController *movie = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:url]];
NSLog(@"%@", movie);
movie.view.frame = CGRectMake(5, 0, 1035, 768);
movie.view.contentMode = UIViewContentModeScaleToFill;
[[movie view] setCenter:CGPointMake(movie.view.center.x-10, movie.view.center.y)];
[movie setControlStyle:MPMovieControlStyleNone];
[movie setShouldAutoplay:YES];
[[self view] addSubview:[movie view]];
return self;
}
“movie”的NSLog给出“MPMoviePlayerController:0x1b77f0”,但是崩溃时的错误消息是“ * - [MPMoviePlayerController playbackState]:消息发送到解除分配的实例0x1473a0”。帮助
答案 0 :(得分:0)
根据文档,看起来电影视图的框架需要与其父视图相匹配。还可以尝试将代码移出initWithNibName:bundle:into viewDidLoad:
- (void)viewDidLoad {
[super viewDidLoad];
UIView *movieContainer = [[UIView alloc] initWithFrame:CGRectMake(5, 0, 300, 400)];
//Do any other positioning of the view you would like
NSString *path = [[NSBundle mainBundle] pathForResource:@"p0600c0100cmpintro" ofType:@"m4v"];
NSURL *url = [NSURL fileURLWithPath:path];
MPMoviePlayerController *movie = [[MPMoviePlayerController alloc] initWithContentURL:url];
movie.view.frame = movieContainer.bounds; //Make sure this is the bounds of its parent view
movie.scalingMode = MPMovieScalingModeFill;
movie.controlStyle = MPMovieControlStyleNone;
movie.shouldAutoplay = YES;
[movieContainer addSubview:movie.view];
[self.view addSubview:movieContainer];
[movieContainer release];
}
最后一个建议是保留电影的引用,以便在取消分配视图控制器后可以取消分配
答案 1 :(得分:0)
我建议您在viewDidLoad
中创建您的MoviePlayer,然后在viewDidAppear
制作电影,以获得最佳效果。
答案 2 :(得分:0)
好吧,所以我有另一个MPMoviePlayerController实例,它之前被解除分配,但是当我尝试创建另一个MPMoviePlayerController实例时,发送给这个实例的所有消息都被发送到解除分配的实例,导致内存问题。所以我刚刚删除了我发布第一个实例的部分,它完全正常。我现在的问题是:有没有办法解除分配这个第一个实例,以便在不需要它时不会对内存造成负担?我觉得应该有一个更优雅的解决方案来解决这个问题。我需要经常在这个应用程序中播放视频。
答案 3 :(得分:0)
几个星期前我找到了这个解决方案并忘记了这篇文章。我没有成功发布MPMoviePlayerController。对于那些好奇的人,为了释放MPMoviePlayerController,我们必须首先从NSNotificationCenter中删除通知(如果已经设置),停止电影(即使它已经完成播放),然后释放它。我之前没有在我的第一个MPMoviePlayerController的应用程序中这样做,所以它试图引用解除分配的实例。电影播放完毕后,这里是成功发布电影的代码:
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:movie];
[movie.view removeFromSuperview];
[movie stop];
[movie release];