2013-04-18 32 views
2

使用ARC管理內存CGImageRef的規則是什麼?也就是說,有人可以幫助我找到正確的文檔嗎?管理CGImageRef內存的規則?

我從照片庫中獲取圖像和創建UIImage以顯示:

CGImageRef newImage = [assetRep fullResolutionImage]; 
... 
UIImage *cloudImage = [UIImage imageWithCGImage:newImage scale:scale orientation:orientation]; 

我需要做CGImageRelease(newImage)

我收到內存警告,但它不似乎是一個逐漸積累的對象,我還沒有發佈,我沒有看到儀器泄漏。我很困惑。

回答

7

不,你不需要調用CGImageRelease()ALAssetRepresentation的便利方法,如fullResolutionImagefullScreenImage返回CGImageRef。不幸的是,目前這些方法的文檔和頭文件沒有說清楚。

如果您使用CGImageCreate*()函數之一自己創建CGImageRef,則您擁有該函數並負責使用CGImageRelease()釋放該圖像ref。相比之下,由fullResolutionImagefullScreenImage返回的CGImageRef似乎是「自動釋放」的,因爲您不擁有這些方法返回的圖像ref。例如,假設您嘗試這樣的事情在你的代碼:

CGImageRef newImage = [assetRep fullResolutionImage]; 
... 
UIImage *cloudImage = [UIImage imageWithCGImage:newImage 
         scale:scale orientation:orientation]; 
CGImageRelease(newImage); 

如果你運行靜態分析儀,它會發出的CGImageRelease(newImage);線以下警告:引用計數的

不正確遞減未 由主叫方

注意在這一點上擁有的對象,你會得到這樣的警告,無論你的項目是否被設置爲使用手動引用計數或AR的C。

相反,對於的NSBitmapImageRepCGImage方法的文檔,例如,使得一個事實,即返回的CGImageRef會被自動釋放更加清晰:

返回一個核心圖形圖像對象

CGImage從接收器的當前位圖數據中獲取 。

- (CGImageRef)CGImage

返回值

返回基於接收器的 當前位圖數據的自動釋放CGImageRef不透明的類型。

+0

謝謝你的深思熟慮的答案。靜態分析儀。必須記得經常這樣做。 –

+2

您只需要記住Core Foundation內存管理規則。如果函數名稱中包含「Create」,則管理其內存;如果沒有,那麼你不。 – fumoboy007

+0

@ fumoboy007這個規則非常有用。 –