2010-09-23 57 views
3

我創建一個位圖背景下,在我的代碼中有這樣的:該方法返回的CGContextRef對象如何發佈?

bitmapData = malloc(bitmapByteCount); 

context = CGBitmapContextCreate (bitmapData, 
            pixelsWidth, 
            pixelsHeight, 
            8,  // bits per component 
            bitmapBytesPerRow, 
            colorSpace, 
            kCGImageAlphaPremultipliedFirst); 

之前,我想我必須釋放位圖數據。在返回context之前,我可以安全地撥打free(bitmapData)嗎?

回答

3

CGBitmapContextCreate文檔說這個:

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

我建議你傳遞NULL而不是malloc'd指針,你將不會擔心它的內存。

然而,當心,CGBitmapContextCreate其名稱中有「創造」,所以按照規定,您將自己的對象返回。您需要在CFRelease()的某個時間發佈此信息。

+0

難道這不是真的嗎?如果方法名稱中有「創建」,則必須自動釋放它,以便接收方不必擔心內存管理。只有在方法名稱或「alloc」中爲「新」時,您才必須手動釋放。至少這是我學到了什麼;) – openfrog 2010-09-23 09:36:49

+0

這個問題:http://stackoverflow.com/questions/870243/releasing-core-foundation-object-references解釋關於核心基礎釋放對象的幾件事情。 Core Foundation沒有autorelease的概念。 – Jasarien 2010-09-23 11:06:39

+0

從這個問題的答案中我鏈接到:「由於在Core Foundation中沒有autorelease等價物,如果你從方法返回一個引用,返回數組而不釋放它,你應該(除非你是邪惡的),那麼在方法名中包含「create」以向調用者指示他們現在擁有對返回對象的引用。「 – Jasarien 2010-09-23 11:08:41

1

Jasarien的回答是最好的,如果你正在爲iOS 4.0或更高版本開發。如果你想支持舊版本,那麼繼續閱讀。

你必須保持的位圖數據,只要四周,正在使用的上下文。如果嘗試繪製位圖上下文並釋放bitmapData,則會發生「壞事」。在上下文中調用CFRelease後,最好的解決方案是釋放bitmapData。如果您調用CGBitmapContextCreateImage從位圖上下文中提取CGImage,那麼請不要擔心......當您釋放位圖上下文時,CGImage將自行創建位圖數據的副本。

這意味着是,使創建並返回一個位圖上下文可能不是最棒的想法的方法或功能。如果可以的話,最好在方法的頂部創建上下文,在該方法中使用它,然後釋放上下文並在方法結束時釋放位圖。如果你不能這樣做,考慮將上下文和它的bitmapData存儲在ivars中。如果您一次需要多個位圖上下文,您可能需要創建一個對象來跟蹤上下文及其bitmapContext。

這就是爲什麼它是最好的傳遞NULL爲位圖數據,如果你只支持IOS版本4.0或更高版本。如果您使用的是4.0+並且傳遞了NULL,那麼您可以放心地忽略上面所述的內容,並確保調用者最終在返回的上下文中調用CFRelease。