Я создал новый 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
Прежде всего, спасибо за ваш быстрый ответ. Итак, как я правильно настроил свой объект типа MPMoviePlayerViewController и уведомление для этого Movieplayer-Object? Если я не передаю «moviePlayerController.moviePlayer», я не получу уведомления, если фильм закончен? Каков правильный способ отображения видео при использовании MPMoviePlayerViewController? – geforce
Не знаете, почему вы думаете, что если вы не пройдете фильм MoviePlayerController.moviePlayer, вы не получите уведомление. Вы все равно получите уведомление - параметр объекта используется для ограничения объектов, которые вы хотите контролировать, но поскольку вы, вероятно, не используете больше одного видеоконтроллера в любое время, это строго не требуется. Вам нужно убедиться, что вы освобождаете свой MPMoviePlayerViewController, а не какие-либо его свойства. Один из способов сделать это - сделать ваш контроллер просмотра фильмов свойством вашего текущего контроллера представления и освободить его в методе dealloc – lxt
Я только что изменил уведомление на это: «MPMoviePlayerViewController * moviePlayerController = [[MPMoviePlayerViewController alloc] initWithContentURL: [ NSURL fileURLWithPath: url]]; \t [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (moviePlayBackComplete :) имя: MPMoviePlayerPlaybackDidFinishNotification object: moviePlayerController]; ". Теперь я не получаю NSLog-вывод, когда он закончил, потому что уведомления предназначены только для MPMoviePlayer, а не MPMoviePlayerViewController .. – geforce