MPMoviePlayerViewController iPad Утечка памяти - PullRequest
0 голосов
/ 04 октября 2010

Мой видеоплеер теряет память только на iPad и только при нажатии кнопки «Готово».Если фильм воспроизводится до конца, он очищается должным образом.Вот код воспроизведения:

mViewPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:[self movieURL:@"mymovie"]];
[self.parentViewController presentModalViewController:mViewPlayer animated:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerPlaybackDidFinishNotification object:[mViewPlayer moviePlayer]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:[mViewPlayer moviePlayer]];

А вот код очистки:

- (void)exitedFullscreen:(NSNotification*)aNotification 
{
 MPMoviePlayerController *player = [aNotification object];
 [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];
 [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:player];

 [self.parentViewController dismissModalViewControllerAnimated:YES];
 NSLog(@"retainCount theMovie: %i", [mViewPlayer retainCount]); 
 player.initialPlaybackTime = -1;
 [player pause];
 [player stop];
 NSLog(@"retainCount theMovie: %i", [mViewPlayer retainCount]); 
 [player release];
 player = nil;
// [mViewPlayer release];
 mViewPlayer = nil;
}

Значение retainCount равно 3, как при печати выше, так и при нормальном завершении фильма иликогда нажата кнопка «Готово».

Я также пытался использовать MPMoviePlayerController с теми же результатами.Я пытался использовать подготовленную игру и 10 различных методов для вызова контроллера MPMoviePlayer *, но он всегда протекает, когда я нажимаю кнопку Готово.

Любая помощь будет принята с благодарностью.Спасибо.

Ответы [ 3 ]

0 голосов
/ 10 ноября 2010

Вы забыли выпустить проигрыватель moviePlayer рядом с init. Вы можете сделать это так:

mViewPlayer = [[MPMoviePlayerViewController alloc] initWithContentURL:[self movieURL:@"mymovie"]];
[self.parentViewController presentModalViewController:mViewPlayer animated:YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerPlaybackDidFinishNotification object:[mViewPlayer moviePlayer]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(exitedFullscreen:) name:MPMoviePlayerDidExitFullscreenNotification object:[mViewPlayer moviePlayer]];
[mViewPlayer release];
0 голосов
/ 12 августа 2011

У меня такая же проблема.Чтобы остановить его без утечки памяти, мне нужно перенестись на последние несколько секунд, чтобы он мог завершиться сам по себе.

Но позже я узнал, что эта утечка есть только на iPad Simulator.Это нормально, если вы запустите его на устройстве.

0 голосов
/ 03 ноября 2010

При удалении наблюдателя экземпляр MPMoviePlayer был сохранен с автоматическим выпуском.Обертывание кода удаления наблюдателя с помощью автоматического выпуска приведет к тому, что retainCount будет соответствовать ожидаемому.

Как это:

// remove all observers
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // following messages adds to autorelease pool
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];
[[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerDidExitFullscreenNotification object:player];
[pool drain], pool = nil;
...