1

にカスタムUIView描画がありdrawRectます。

私は C API をよく知らないので、どのようなメモリ ルールが必要なのかわかりません。init retainObjective-C のルールは非常に単純で、所有しているものはすべてorを介してリリースすると述べていますcopyが、C 関数CGGradientCreateWithColorComponentsは Objective-C ではなく、Product > Analyze でリークの可能性があると報告されています。

この関数の結果をリリースする必要がありますか? もしそうなら、どのように? 一般的に、これらの API に関して、手動で解放する必要があるメモリが関数によって割り当てられているかどうかを簡単に知る方法はありますか?

更新:これまでの回答の情報のおかげで、コードは次のとおりです。私はincorrect decrement今エラーが発生しています:

CGGradientRef theGradient=[self makeGradient:YES];
//do something with theGradient in my drawing
CGGradientRelease(theGradient); // this line Analyze says incorrect decrement of object not owned by caller

そしてmakeGradient私は持っています:

 - (CGGradientRef)makeGradient:(BOOL)red{
     CGGradientRef gradient;
     //create my gradient
     return gradient;
 }
4

2 に答える 2

6

原則として、名前に「Create」または「Copy」が含まれる関数を呼び出す場合は、返されたオブジェクトを解放する必要があります。これを「作成ルール」と呼びます。

名前に「Create」が埋め込まれた関数を使用してグラデーションを作成しました。つまり、グラデーションを解放する責任があります。CGGradientReleaseまたはを使用できますCFRelease

Create ルールおよびその他のメモリ管理規則については、Core Foundation のメモリ管理プログラミング ガイドを参照してください

Quartz 2D Programming Guide : Memory Management: Object Ownershipも読むことができます。

アップデート

新しいコード サンプルに基づいて、別のメモリ管理規則について学習する必要があることがわかりました。;^)

Objective-C メソッドは、Core Foundation 関数とはわずかに異なる命名規則を使用します。名前に「Create」または「Copy」を入れる代わりに、Objective-C メソッドの規則では、オブジェクトを返す場合、名前は「alloc」、「new」、「copy」、または「mutableCopy」で始まる必要があります。発信者は解放する必要があります。( Objective-C のメモリ管理規則については、こちらを参照してください。 )

メソッドの名前を から に変更makeGradient:するnewGradient:と、アナライザーは文句を言わなくなります。テストしました!:^)

于 2012-08-08T06:10:25.150 に答える
1

CGGradientRelease、簡単に。

于 2012-08-08T06:07:35.427 に答える