我有一個函數,它需要一些位圖數據並從中返回一個UIImage *。它看起來像這樣:緩衝區> CGImageRef-> UIImage的正確內存管理模式是什麼?
UIImage * makeAnImage()
{
unsigned char * pixels = malloc(...);
// ...
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, pixelBufferSize, NULL);
CGImageRef imageRef = CGImageCreate(..., provider, ...);
UIImage * image = [[UIImage alloc] initWithCGImage:imageRef];
return [image autorelease];
}
任何人都可以解釋到底誰在這裏擁有什麼內存?我想正確清理,但我不確定如何安全地進行清理。 Docs對這些模糊不清。如果我在這個函數的末尾創建了UIImage,然後使用UIImage,我會崩潰。如果我在創建UIImage之後釋放提供程序或imageRef,我沒有看到崩潰,但它們顯然是將像素全部傳遞過來的,所以我很擔心釋放這些中間狀態。 (我知道每CF文件,我應該需要調用後者的發佈,因爲它們來自創建函數,但我可以在使用UIImage之前做到這一點?)大概我可以使用提供程序的dealloc回調來清理像素緩衝區,但還有什麼?
謝謝!
謝謝Kenny。這是一個很好的簡潔描述;我想我被原始的堆緩衝區的不可預測性所拋棄了一些,但是一如既往地相信規則並且會得到回報。乾杯。 – 2010-01-26 07:10:39
只需添加一些說明,核心功能中的關鍵詞就是「創建」和「新建」。如果函數包含這些單詞中的任何一個,則必須釋放返回的內存。 大多數核心數據類型都是CFType兼容的。這意味着如果它更容易,你可以使用Objective-C保留/釋放/ autorelease調用。即[(id)imageRef釋放];或CFRelease(imageRef); – 2010-01-26 09:06:24
如果使用CFRelease,請記得檢查'imageRef'是否爲NULL。 – kennytm 2010-01-26 09:33:31