2012-01-19 63 views
2

我有一個iPhone應用程序,我將許多CGColors拆分成組件,平均組件,然後用新組件創建新的顏色。當我運行此代碼時,Instruments發現我正在泄漏大量CGColors,並且該應用運行緩慢。高效地修改CGColor

我覺得我可以解決內存泄漏問題,如果有一種方法可以做我做的事情,而不是每次都使用CGColorCreate(colorspace,components)。

這是色「並稱」

const CGFloat *cs=CGColorGetComponents(drawColor); 
const CGFloat *csA=CGColorGetComponents(add->drawColor); 
CGFloat r=(cs[0]*w+csA[0]*aW)/1; 
CGFloat g=(cs[1]*w+csA[1]*aW)/1; 
CGFloat b=(cs[2]*w+csA[2]*aW)/1; 
CGFloat components[]={r, g, b, 1.f}; 
drawColor=CGColorCreate(CGColorSpaceCreateDeviceRGB(), components); 

任何幫助將非常感激,即使幫助是代碼「添加顏色較少。」我確信我不是唯一試圖修改CGColors的人。

編輯:所以,rob的評論把我放在正確的軌道上,但我得到malloc雙免費錯誤,因爲添加顏色的方法多次被稱爲新的drawColor分配前。有沒有辦法在釋放之前檢查drawColor是否存在?這是新的相關代碼。

CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB(); 
CGColorRelease(drawColor); 
drawColor=CGColorCreate(colorSpace, components); 
CGColorSpaceRelease(colorSpace); 

回答

0

如果您正在泄漏CGColor對象,解決您的問題的第一步是停止泄漏它們。完成顏色對象後,您需要致電CGColorRelease。例如,您顯然在示例代碼中泄漏drawColor對象。你應該這樣做:

CGColorRelease(drawColor); 
drawColor=CGColorCreate(CGColorSpaceCreateDeviceRGB(), components); 

到您指定的新對象drawColor之前釋放由drawColor引用的舊對象。

CGColor對象是不可變的,所以你將無法修改你現有的對象。

+0

感謝您的回答。在將它分配給CGContextSetStrokeColorWithColor(context,color)的上下文後,我釋放CGColor。那會完成同樣的事情,不是嗎?我現在無法測試你的建議,但我會遲一點。 – Enigmoid

+0

我不認爲我可以編輯評論,但你是對的。我在泄漏顏色,因爲指定drawColor的方法比drawRect更頻繁:我釋放顏色。感謝您指出了這一點;當我有機會的時候我會去測試它。 – Enigmoid

+0

無論您或任何人是否對我編輯的問題有答案,我找到了放置我的CGColorReleases的地方。感謝您的幫助。 – Enigmoid

4

敢肯定你只需要CGColorRelease(drawColor),防止泄漏。看看如何幫助你的表現。

+2

psst!請注意'CGColorSpaceCreateDeviceRGB'; – justin

+0

謝謝,賈斯汀。我查了一下,現在我發佈了我在線分配的CGColorSpaceRef。有沒有辦法提高評論? – Enigmoid