2010-12-20 24 views
0

你好!我正在编写一个iPad应用程序,当UIView加载时我需要能够播放视频。然而,如果我在初始化它的任何地方尝试向我的MPMoviePlayerController发送消息,我正在获得BAD_EXC_ACCESS。我从我的* .h文件中删除了MPMediaPlayerController,然后完全在实现文件中声明了它,现在我在代码下方的底部得到消息。在构建和分析内存泄漏(或任何问题)方面,没有任何问题,并且我找不到任何关于此的帖子。这里是我的代码:当UIView加载时立即播放视频

- (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; 
    } 

的 “电影” 的NSLog赋予 “的MPMoviePlayerController:0x1b77f0”,但随后在碰撞时的错误消息是 “* - [的MPMoviePlayerController playbackState]:消息发送到释放实例0x1473a0”。帮帮我?

回答

0

几周前我找到了解决方案,并忘记了这篇文章。我没有成功发布MPMoviePlayerController。对于那些好奇的人,为了发布MPMoviePlayerController,我们必须首先从NSNotificationCenter中删除通知(如果已设置),停止播放电影(即使播放完毕),然后释放它。我之前没有在应用程序中使用我的第一个MPMoviePlayerController执行此操作,因此它试图引用释放的实例。当电影完成播放时,以下是成功发布电影的代码:

[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackStateDidChangeNotification object:movie]; 
[movie.view removeFromSuperview]; 
[movie stop]; 
[movie release]; 
0

根据文档,它看起来像电影视图的框架需要匹配其父视图。也可以尝试移动你的代码了initWithNibName的:束:到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]; 
} 

最后一个建议是保持电影的参考,这样就可以的dealloc一次的视图控制器被释放

+0

不行。我仍然收到错误消息“发送到解除分配的实例

”。但现在我得到一个不错的空白页面,而不是应用程序崩溃。这是因为我将代码移到了viewDidLoad方法中。 – Jacob 2010-12-20 22:40:46

0

我会建议您在viewDidLoad中创建您的MoviePlayer,然后在viewDidAppear中进行电影播放,以获得最佳效果。

+0

当我尝试分配并初始化MPMoviePlayerController时,就会出现问题。我不知道为什么。我在我的应用程序中播放了另一个视频,并将其内容与我正在与之战斗的视频切换,而且播放效果非常好。 – Jacob 2010-12-20 22:51:37

+0

那么视频本身会出现问题? – WrightsCS 2010-12-20 23:02:36

+0

啊,我的意思被误解了。我遇到的视频在第一张专辑中表现不错。我设法让视频的第一帧出现,但是如果我将shouldAutoplay设置为YES,它会再次给我“解除分配”的消息并使应用程序崩溃。如果我试图发送“电影”“播放”消息,我会得到“释放”消息。 – Jacob 2010-12-20 23:40:20

0

好的,所以我有另一个MPMoviePlayerController实例被更早解除分配,但是当我尝试创建MPMoviePlayerController的另一个实例时,发送到这个实例的所有消息都被发送到解除分配的实例,导致内存问题。所以我只是删除了我发布第一个实例的部分,并且它工作得很好。我现在的问题是:有没有办法将这个第一个实例解除分配,以便它在不需要时不会成为内存负担?我觉得应该有一个更优雅的解决方案来解决这个问题。我需要在这个应用程序中经常播放视频。