2011-06-17 80 views
4

當我使用CGBitmapContextCreate()手動創建CGContextRef時,是否還必須手動釋放位圖數據?如何在創建CGContextRef時正確清理內存?

現在我正在這樣做:我有一個方法創建並返回一個CGContextRef。裏面那個方法,我也創建數據的這種情況下,像這樣:

bitmapData = malloc(bitmapByteCount); 
context = CGBitmapContextCreate(bitmapData, ...); 
return context; 

直到現在我始終相信,一切都只是罰款時,該方法的調用者使用後,簡單地釋放CGContextRef:CGContextRelease(theContext);

CGBitmapContextCreate文檔:

在iOS系統4.0和更高版本,以及Mac OS X v10.6中 後來,如果 你想石英爲分配內存,你可以傳遞NULL位圖。這可以讓你從管理你自己的內存的 中解放出來,它可以減少內存泄漏問題。

這讓我覺得我必須用我的背景下這一個方便的方法,我在創建後釋放兩兩件事:釋放背景下的位圖數據,然後上下文本身。

所以,我必須這樣做:

void *data = CGBitmapContextGetData(context); 
if (data != NULL) { 
    free(data); 
} 

所以我在這裏有一個大的內存泄漏,如果我不重構我的代碼也將發佈的位圖數據,而不是隻語境?

回答

3

是的。你必須最終free() bitmapData(一旦CGContext完成繪圖等),如果你malloc()編輯它。

看到我的(更正)回答your other question

如果使用NULL選項(即如果你不malloc()你的位圖數據),我希望數據指針是有效的,直到你CGContextRelease()您的上下文。因此,在釋放上下文之前,您可能需要執行任何想要處理的數據,或者將位圖數據複製到某處(在這種情況下,您可以事先將內存傳遞給上下文)。