Как можно освободить предзагрузку памяти MPMoviePlayerController - PullRequest
0 голосов
/ 17 января 2011

ПРИВЕТ.Я использую MPMoviePlayerController в своем приложении для iPhone, чтобы иногда показывать несколько коротких видеоклипов.В приложении mainView есть несколько кнопок.Когда я нажимаю кнопку, фильм будет воспроизводиться.Когда я нажимаю кнопку, вызывается кнопка [self playVideo: @ "xxx"], и видео отображается правильно. Но когда я вижу приложение с Инструментом распределения инструментов, я вижу, что выделенная память достигает 8+ МБи не освобождается после того, как игрок закончил. Если я нажму кнопку примерно 15 раз, ipad рухнет.Ответственным за распределение является ответственная библиотека под названием CoreVideo .Может быть, утечка памяти при предварительной загрузке видео, но не освобождает после его завершения.Как я могу освободить эти воспоминания.Вот методы в категории:

-(id)playVideo:(NSString* )videoName
{
    NSString* s = [[NSBundle mainBundle] pathForResource:videoName ofType:@"mp4"];
    NSURL* url = [NSURL fileURLWithPath:s];
    [self playVideoAtURL: url];
    s = nil;
    [s release];
    url = nil;
    [url release];
}


-(void)playVideoAtURL:(NSURL *)theURL
{
    theMovie = [[MPMoviePlayerViewController alloc] initWithContentURL:theURL];
    theMovie.moviePlayer.scalingMode = MPMovieScalingModeAspectFit;
    theMovie.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
    if (LeftOrRight == 0) {
        [theMovie.view setTransform: CGAffineTransformMakeRotation(degreesToRadians(-90))];
    }
    else if (LeftOrRight == 1) {
        [theMovie.view setTransform: CGAffineTransformMakeRotation(degreesToRadians(90))];
    }
    CGRect screenBounds = [[UIScreen mainScreen] bounds];  
    theMovie.view.frame = screenBounds;
    theMovie.moviePlayer.movieSourceType = MPMovieSourceTypeFile;
    [theMovie.moviePlayer prepareToPlay]; 
    [self presentModalViewController: theMovie animated: YES]; 

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(myMovieFinishedCallback:)
                                                 name: MPMoviePlayerPlaybackDidFinishNotification
                                               object:nil]; 
}

-(void)myMovieFinishedCallback:(NSNotification *)aNotification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:nil];
    [theMovie  dismissMoviePlayerViewControllerAnimated];
    [theMovie.moviePlayer stop];
    [theMovie release];
}

Спасибо!

1 Ответ

1 голос
/ 24 мая 2011

Ваш код содержит несколько утечек памяти.

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

NSString* s = [[NSBundle mainBundle] pathForResource:videoName ofType:@"mp4"];
s = nil;
[s release];

Вы не отпускаете MPMoviePlayerViewController при вызове метода playVideoAtURL

-(void)playVideoAtURL:(NSURL *)theURL
{
    // YOU HAVE MEMORY LEAK IN NEXT LINE!!!

    theMovie = [[MPMoviePlayerViewController alloc] initWithContentURL:theURL];

    ...
}

Поэтому, если фильм не закончен, вы выделяете новый экземпляр MPMoviePlayerViewController и не выпускаете предыдущий.

...