2011-01-17 4 views
0

Hallo. Ich verwende einen MPMoviePlayerController in meiner iPhone App, um manchmal kurze Videoclips anzuzeigen. Es gibt einige Schaltflächen in der App mainView. Wenn ich den Knopf drücke, wird der Film abgespielt. Wenn ich die Taste drücke, ruft die Taste [self playVideo: @ "xxx"] auf und das Video wird korrekt angezeigt. Aber wenn ich die App mit Instruments Allocations Tool sehe, sehe ich, dass der zugewiesene Speicher bis zu 8+ MB bekommt und nicht freigegeben wird, nachdem der Spieler fertig ist. Wenn ich den Knopf nur ungefähr 15. Mal drücke, wird das iPad zusammenbrechen. Verantwortlich für die Zuordnungen ist eine verantwortliche Bibliothek mit der Bezeichnung CoreVideo. Vielleicht ist der Speicher beim Vorabladen des Videos undicht, wenn es nach dem Beenden nicht mehr freigegeben wird. Wie kann ich diese Erinnerung freigeben? Hier sind die Methoden in der Kategorie:Wie kann MPMoviePlayerController Freigabe Speicher

-(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]; 
} 

Dank!

Antwort

1

Ihr Code enthält mehrere Speicherlecks.

String hier zugewiesen nie veröffentlicht, weil Sie es auf Null gerade vor dem Loslassen.

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

Sie nicht MPMoviePlayerViewController freigeben, wenn Aufruf playVideoAtURL Methode

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

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

    ... 
} 

Deshalb, falls Film fertig nicht Sie neue Instanz von MPMoviePlayerViewController zuweisen und entbindet nicht vorherige.