не удалось выпустить MPMoviePlayerController - PullRequest
0 голосов
/ 03 августа 2011

Я создал глобальную переменную:

MPMoviePlayerController *player;

Я играю видео следующим способом:

- (IBAction) playMovie: (NSString *) videoName ViedeoType: (NSString *) videoType {

ViewVideoSubview.alpha = 0;

NSString *url = [[NSBundle mainBundle] 
                 pathForResource:videoName 
                 ofType:videoType];


player = 
[[MPMoviePlayerController alloc] 
 initWithContentURL:[NSURL fileURLWithPath:url]];


player.shouldAutoplay =YES;



[ViewVideoSubview addSubview:player.view];



[[NSNotificationCenter defaultCenter] 
 addObserver:self
 selector:@selector(movieFinishedCallback:)                                                 
 name:MPMoviePlayerPlaybackDidFinishNotification
 object:player];

}

и когда воспроизведение видео заканчивается само по себе, вызывается следующий метод get:

- (void) movieFinishedCallback:(NSNotification*) aNotification {



    [player.view removeFromSuperview];  //d1
    MPMoviePlayerController *playerParam = [aNotification object];
    [[NSNotificationCenter defaultCenter] 
     removeObserver:self
     name:MPMoviePlayerPlaybackDidFinishNotification
     object:playerParam];  

     [player release];

}

Пока все отлично работает. Проблема в том, что у меня есть кнопка, при нажатии которой мне нужно загрузить другой контроллер вида. Я могу загрузить этот контроллер просмотра, но видео по-прежнему воспроизводится в фоновом режиме. Я не понимаю, почему я получаю ошибку при выпуске плеера. Мое временное решение - остановить видео, а затем загрузить другой контроллер представления, чтобы видео не воспроизводилось в фоновом режиме.

Другое решение, о котором я думал, - это воспроизвести видео за 1 секунду до того, как оно закончится, чтобы его выпустили с помощью метода movieFinishedCallback. Я не знаю, как я смогу «перемотать» видео к этому моменту. Я новичок в target-c, и я не знаю, что такое параметр aNotification, иначе я просто вызову этот метод с соответствующим параметром.

Позвольте мне показать вам ошибку, которую я получаю:

enter image description here enter image description here

1 Ответ

2 голосов
/ 03 августа 2011

Я думаю, что ваша проблема заключается в том, как вы пытаетесь удалить наблюдателя в методе movieFinishedCallback

здесь вы передаете указатель на ваш глобальный проигрыватель свойств.

MPMoviePlayerController *playerParam = [aNotification object];

и здесь вы вызываете метод удаления наблюдателя для всех уведомлений об этом объекте playerParam

[[NSNotificationCenter defaultCenter] 
 removeObserver:self
 name:MPMoviePlayerPlaybackDidFinishNotification
 object:playerParam];  

Теперь вы получаете EXEC_BAD_ACCESS, потому что вы отправляете указатель (playerParam) на player (уже выпущенный где-то) на метод (removeObserver), вызывающий операцию removeObserver для не -существующий объект.

Вместо использования

[[NSNotificationCenter defaultCenter] 
     removeObserver:self
     name:MPMoviePlayerPlaybackDidFinishNotification
     object:playerParam]; 

1020 * попробовать *

[[NSNotificationCenter defaultCenter] 
     removeObserver:self
     name:MPMoviePlayerPlaybackDidFinishNotification
     object:nil]; 

Создание вашего объекта ноль будет:

- (void) removeObserver: (id) имя уведомленияObserver: (NSString *) объект NotificationName: (id) NotificationSender

.

Уведомление отправителя ... Когда ноль , получатель не использует отправителей уведомлений в качестве критерия для снятия.

Дополнительную информацию можно найти в Ссылка класса NSNotificationCenter

...