2011-01-10 5 views
0

Я создал новый ViewController (только с файлами .h и .m) и добавил этот код для воспроизведения видео. После завершения видео я получаю ошибку «Exe_bad_access».Ошибка MPMoviePlayer Ошибка после воспроизведения видео

сообщение

Ошибка при добавлении "NSZombieEnabled = истина" к excecutable в качестве аргумента:


«TestPlayingVideo [654: 207] - [MPMoviePlayerController остановки]: сообщение, отправленное на высвобождены например 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

Там очень много путаницы здесь за то, что вы рилизинг: например, вот ваш главный Alloc вашего видеоплеера:

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

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

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

+0

Прежде всего, спасибо за ваш быстрый ответ. Итак, как я правильно настроил свой объект типа MPMoviePlayerViewController и уведомление для этого Movieplayer-Object? Если я не передаю «moviePlayerController.moviePlayer», я не получу уведомления, если фильм закончен? Каков правильный способ отображения видео при использовании MPMoviePlayerViewController? – geforce

+0

Не знаете, почему вы думаете, что если вы не пройдете фильм MoviePlayerController.moviePlayer, вы не получите уведомление. Вы все равно получите уведомление - параметр объекта используется для ограничения объектов, которые вы хотите контролировать, но поскольку вы, вероятно, не используете больше одного видеоконтроллера в любое время, это строго не требуется. Вам нужно убедиться, что вы освобождаете свой MPMoviePlayerViewController, а не какие-либо его свойства. Один из способов сделать это - сделать ваш контроллер просмотра фильмов свойством вашего текущего контроллера представления и освободить его в методе dealloc – lxt

+0

Я только что изменил уведомление на это: «MPMoviePlayerViewController * moviePlayerController = [[MPMoviePlayerViewController alloc] initWithContentURL: [ NSURL fileURLWithPath: url]]; \t [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (moviePlayBackComplete :) имя: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; ". Теперь я не получаю NSLog-вывод, когда он закончил, потому что уведомления предназначены только для MPMoviePlayer, а не MPMoviePlayerViewController .. – geforce

Смежные вопросы