【问题标题】:MPMoviePlayer Bad-Access error after playing video播放视频后 MPMoviePlayer Bad-Access 错误
【发布时间】:2011-01-10 20:51:55
【问题描述】:

我创建了一个新的 ViewController(仅包含 .h 和 .m 文件)并添加了该代码来播放视频。视频完成后,我收到“Exe_bad_access”错误。

将“NSZombieEnabled=true”作为参数添加到可执行文件时出现错误消息:


"TestPlayingVideo[654:207] -[MPMoviePlayerController stop]:发送到已释放实例的消息 0x63042d0"


这有什么问题吗?播放视频时如何进行正确的内存管理?

#import "TestPlayingVideoViewController.h"
#import <MediaPlayer/MediaPlayer.h>

@implementation TestPlayingVideoViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor darkGrayColor]];


    UIButton* btn = [[UIButton alloc] initWithFrame:CGRectMake(50 , 50, 200, 25)];
    [btn setTitle:@"press me" forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(action:)    forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn];
    [btn release];
}

- (void)action:(id)sender
{
    NSLog(@"UIButton was clicked");

     NSString *url   =   [[NSBundle mainBundle] pathForResource:@"mymovie" ofType:@"m4v"];
     MPMoviePlayerViewController* moviePlayerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:url] ];

     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackComplete:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayerController.moviePlayer];
     [moviePlayerController.moviePlayer play];

     //[self.view addSubview:moviePlayerController.view];
    [self presentMoviePlayerViewControllerAnimated:moviePlayerController];
}


- (void) moviePlayBackComplete:(NSNotification*) notification {

    MPMoviePlayerController* player = [notification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player]; 
    [self dismissMoviePlayerViewControllerAnimated];

    [player stop];
    //[self.view removeFromSuperView];
    [player release];
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}

@end

【问题讨论】:

    标签: iphone video mpmovieplayercontroller exc-bad-access


    【解决方案1】:

    对于您发布的内容有很多混淆:例如,这是您的电影播放器​​的主要分配:

     MPMoviePlayerViewController* moviePlayerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:url] ];
    

    但是你释放的不是这个moviePlayerController - 你只是释放你的MPMoviePlayerController 的.movi​​ePlayer 属性。请注意,当您创建 NSNotification 时,您正在传递moviePlayerController.movi​​ePlayer,只是moviePlayerController。

    所以你没有释放你的moviePlayerController,你实际上是在尝试释放那个对象的一个​​属性。这是你不应该做的——你应该释放对象,让它担心释放它的属性。

    【讨论】:

    • 首先,感谢您的快速答复。那么,如何正确设置 MPMoviePlayerViewController 类型的对象和对该电影播放器​​对象的通知?如果我没有通过“moviePlayerController.movi​​ePlayer”,如果电影完成,我不会收到任何通知?使用 MPMoviePlayerViewController 时显示视频的正确方法是什么?
    • 不知道为什么你认为如果你不通过moviePlayerController.movi​​ePlayer你不会收到通知。您仍然会收到通知 - object 参数用于限制您希望监视的对象,但由于您可能在任何时候都不会使用多个电影控制器,因此并非严格要求。您需要确保发布您的 MPMoviePlayerViewController,而不是它的任何属性。一种方法是让你的电影视图控制器成为你当前视图控制器的属性,并在 dealloc 方法中释放它
    • 我刚刚将通知更改为:“MPMoviePlayerViewController* moviePlayerController = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:url] ]; [[NSNotificationCenter defaultCenter] addObserver:self 选择器:@selector (moviePlayBackComplete:) 名称:MPMoviePlayerPlaybackDidFinishNotification 对象:moviePlayerController];"。现在我在完成后没有得到 NSLog 输出,因为通知仅适用于 MPMoviePlayer 而不是 MPMoviePlayerViewController..
    • 所以正确的方法是在“[self presentMoviePlayerViewControllerAnimated:moviePlayerController];”行之后释放“moviePlayerViewController”实例,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 2017-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多