Ошибка Bad-Access в MPMoviePlayer после воспроизведения видео - PullRequest
0 голосов
/ 10 января 2011

Я создал новый 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

1 Ответ

1 голос
/ 11 января 2011

Здесь много путаницы по поводу того, что вы выпускаете: например, вот ваш основной ресурс вашего проигрывателя фильмов:

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

Но то, что вы выпускаете , это не moviePlayerController - вы только выпускаете свойство .moviePlayer вашего MPMoviePlayerController. Обратите внимание, что при создании NSNotification вы передаете moviePlayerController.moviePlayer, не просто moviePlayerController.

Таким образом, вы не выпускаете свой moviePlayerController, вы на самом деле пытаетесь освободить свойство этого объекта. Что вы не должны делать - вы должны освободить объект и позволить ему беспокоиться об освобождении его свойств.

...