2012-01-19 16 views
2

私は、多くのCGColorsをコンポーネントに分解し、コンポーネントの平均化を行い、新しいコンポーネントで新しい色をつけることで、多くの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のコメントは適切なトラックに置かれていますが、新しいdrawColorが割り当てられる前に、色を追加するメソッドが複数回呼び出されるため、malloc double freeエラーが発生します。 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を解放しています。それは同じことを達成するだろう、それはwouldnt?私は今あなたの提案をテストすることはできませんが、後で行います。 – Enigmoid

+0

私はコメントを編集できるとは思わないが、あなたは正しい。 drawColorを割り当てるメソッドがdrawRectよりも頻繁に発生するため、色が漏れています。ここでは色を解放します。それを指摘してくれてありがとう。私はチャンスを得るときにそれをテストするつもりです。 – Enigmoid

+0

編集した質問にあなたや他の人が答えを持っているかどうかにかかわらず、CGColorReleaseを置く場所を見つけました。ご協力ありがとうございました。 – Enigmoid

4

漏れを防ぐには、ちょうどCGColorRelease(drawColor)にする必要があります。それがあなたのパフォーマンスにどのように役立つかをご覧ください。

+2

psst! note CGColorSpaceCreateDeviceRGB'; – justin

+0

ありがとう、ジャスティン。私はそれを見て、今私はインラインで割り当てていたCGColorSpaceRefを公開しています。コメントをupvoteする方法はありますか? – Enigmoid

関連する問題