2012-04-02 13 views
2

Ich habe ein Speicherleckproblem von einer sehr einfachen Funktion. Hier ist mein Code:UIImage setImage: Ursache Speicherverlust

-(void) drawPuzzle 
{ 

     gameView.image=nil;  

     UIGraphicsBeginImageContext(gameView.frame.size); 


     [gameView.image drawInRect:CGRectMake(0, 
              0, 
              gameView.frame.size.width, 
              gameView.frame.size.height)]; 



     CGContextRef con=UIGraphicsGetCurrentContext(); 
     CGContextMoveToPoint(con, 20,0); 
     CGContextAddLineToPoint(con,20, gameView.frame.size.height); 
     CGContextStrokePath(con); 


     UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
     [gameView setImage:newImage]; 


    } 

Die Instrumente berichten wie folgt:

Event Type RefCt  Responsible Caller 

Malloc  1   +[UIImage imageWithCGImage: scale: orientation:] 
Autorelease    +[UIImage imageWithCGImage: scale: orientation:] 
Retain  2   -[UIImageView setImage:] 
Release  1   -[NSAutoreleasePool drain]  
+0

entbinden Sie gameView.image? (Angenommen, es wird von setImage beibehalten) – giorashc

+0

Wie? [gameView.image release] oder gameView.image = nil? Ich weiß nicht, warum ich [gameView.image release] brauche, aber ich habe gameView.image = nil vor [gameView release]. – Lynn

+0

[gameView.image release]; – Lynn

Antwort

-2

setImage: Methode, um Ihre newImage beibehalten. Zur Vermeidung von Speicherverlust müssen Sie newImage freizugeben, nachdem setImage

UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    [gameView setImage:newImage]; 
    [newImage release]; 
+0

Das ergibt keinen Sinn.Sogar setImage: retained newImage es sollte nicht meine Verantwortung sein, es zu veröffentlichen. Und ich habe versucht und code abgestürzt. – Lynn

+0

Der Aufrufer ist nicht dafür verantwortlich, das Ergebnis einer Funktion mit der Get-Semantik freizugeben. –