2011-01-08 102 views
0

我有以下代碼作爲UIImage + Scale.h類別。(iphone)我從圖像創建一個新的圖像時,創建一個泄漏?

-(UIImage*)scaleToSize:(CGSize)size 
{                                              
    UIGraphicsBeginImageContext(size); 

    [self drawInRect:CGRectMake(0, 0, size.width, size.height)]; 

    // is this scaledImage auto-released?                                               
    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    return scaledImage; 
} 

我使用上面獲得的圖像,並使用它如下。

UIImage* image = [[UIImage alloc] initWithData: myData]; 
image = [image scaleToSize: size]; <- wouldn't this code create a leak since 
            image(before scaling) is lost somewhere? 

我想上面的代碼工作,如果圖像首先用自動釋放創建。
但如果圖像是使用「的alloc」創建的,它會造成在我短暫的知識泄漏。

我應該如何改變scaleToSize:警惕呢?

謝謝

  • 編輯 -

我想使用頁頭(或保留)上的UIImage /釋放,這樣我可以在一個點小保留的UIImage的#內存。
(我正在加載很多UIImages在一個循環中,設備不能接受它)

回答

2

請注意,您的代碼可以改寫爲:

UIImage *image = [[UIImage alloc] initWithData:myData]; 
UIImage *scaledImage = [image scaleToSize:size]; 
image = scaledImage; 

所以讓我們看看會發生什麼:

  • image獲得經由alloc,因此你擁有該對象通過返回一個自動釋放物體因爲的方法獲得
  • scaledImage 0返回一個自動釋放的對象
  • 你自己原來的image但你沒有自己scaledImage。你有責任釋放原始的image,否則你有泄漏。

在您的代碼中,您使用單個變量來引用這兩個對象:原始圖像和縮放圖像。這不會改變你自己第一形象,因此你需要釋放,以避免泄漏的事實。既然你使用相同的變量失去了原有的圖像參考,一個常見的成語是送-autorelease原始對象:

UIImage *image = [[[UIImage alloc] initWithData:myData] autorelease]; 
image = [image scaleToSize:size]; 

或者,如果你寧願釋放原始圖像,而不是自動釋放它,

UIImage *image = [[UIImage alloc] initWithData:myData]; 
UIImage *scaledImage = [image scaleToSize:size]; 
[image release]; 
// use scaledImage from this point on, or assign image = scaledImage 

海事組織,它沒有任何意義改變scaleToSize:。這是一個基於給定的UIImage實例創建(自動釋放)圖像的實例方法。它類似於-[NSString stringByAppendingString:],它根據給定的NSString實例創建一個(自動發佈的)字符串。它不會也不應該關心原始字符串的所有權,這同樣適用於您的scaleToSize:方法。該方法如何知道調用者是否想要保留原始圖像?

我還將scaleToSize:重命名爲imageByScalingToSize,使其與Cocoa的命名約定相似 - 您將通過對現有圖像應用操作來獲取圖像。

+0

由於當我修改圖像,大部分時間,我想改變圖像本身,而不是創建一個新的。我希望改變scaleToSize:。最近,我意識到的UIImage是相當大的內存的消費者,並希望保持在內存小的UIImage *的數量。或者至少使用alloc/release來代替autorelease。 – eugene 2011-01-08 16:08:52

1

是的,它肯定你有泄漏。圖像中預先存儲的對象不再被引用但沒有釋放尚未