2012-04-02 103 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