2012-04-02 59 views
2

我從一個非常簡單的函數中獲得了內存泄漏問題。這裏是我的代碼:UIImage setImage:導致內存泄漏

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


    } 

文書報告如下:

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

你釋放gameView.image釋放newImage? (假設它由setImage保留) – giorashc 2012-04-02 13:03:40

+0

如何? [gameView.image release]或gameView.image = nil?我不知道爲什麼我需要[gameView.image發佈],但我在[gameView發佈]之前做過gameView.image = nil。 – Lynn 2012-04-02 13:19:49

+0

[gameView.image release]; – Lynn 2012-04-02 13:22:06

回答

-2

setImage:方法保留您的newImage。爲了避免內存泄漏,你需要經過setImage

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

這沒有意義。即使setImage:保留newImage它不應該是我的責任釋放它。我嘗試了代碼崩潰。 – Lynn 2012-04-02 13:16:20

+0

調用者不負責用'Get'語義釋放函數的結果。 – 2012-04-02 13:26:28