4

オブジェクトのインスタンスを返すメソッドがありCoreGraphicsます - CGPathRef

Analyzer を使用してアプリを実行すると、このメソッドがリークしていると不平を言います...それは意図的なものです。私は所有権を発信者に譲渡し、それらをクリーンアップさせたいと思っています。

このアナライザーの警告を抑制するにはどうすればよいですか?

- (CGPathRef) createSomePath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle
{
  CGMutablePathRef slicePath = CGPathCreateMutable();

  ....

  return slicePath;  <--- Analyzer points to this line as a potential leak.
}

多くのフレームワークがこれらのオブジェクトを返し、呼び出し元がクリーンアップする必要があるため、これが可能であると想定してください...

前もって感謝します !

PS 残念ながら、この質問は重複したものではなく、適切な回答がどこにもありません...このページの上部で強調表示されている 3 つの回答は適切ではありません/完全ではありません...Matthias Bauch ie によって提供された回答のみです。 new" ルールは、私が提起した質問に対する正しい答えです :) ありがとう!

4

2 に答える 2

10

CoreFoundation 関数は「作成ルール」に従います。関数に「Create」が含まれている場合、参照カウントが 1 のオブジェクトが返されます。

残念ながら、あなたの方法はAC関数ではありません。

したがって、Objective-C メソッドを C 関数に変換する必要があります。このようなもの:

CGPathRef CreatePath(CGPoint center, CGFloat innerRadius, CGFloat outerRadius, CGFloat startAngle, CGFloat endAngle) {
    // your code here
}

これはアナライザーを喜ばせ、ARC で正しく動作するはずです。

newObjective-C メソッドでは、メソッド シグネチャを、alloccopyまたはmutableCopyで開始することにより、同様の動作を得ることができます。でメソッドを開始すると、newおそらくあなたのケースに最も適しています。
このようなものはアナライザーを喜ばせるはずですが、ARC で正しく動作するかどうかはわかりません。これをプロファイリングする必要があります。

- (CGPathRef)newPath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle {
    // your code here
}
于 2013-06-25T19:06:51.503 に答える
0

これを行うことができるはずです:

#ifndef __clang_analyzer__
CGMutablePathRef slicePath = CGPathCreateMutable();
#endif

オススメとは言えませんが!

于 2013-06-25T18:13:56.353 に答える