4

静的アナライザーを有効にしましたが、その実行パスの最後でそのオブジェクトが解放されなかったため、メモリリークが発生した可能性があります。ただし、作成されたオブジェクトへの参照を、それを解放する別のクラスに渡します。後でこのオブジェクトをリリースすることをコンパイル済みに伝えるメソッドまたはキーワードがあるかどうか疑問に思いました。

自動リリースのようなものを探しています。

ちなみに、私はARCを使用しています。

次のようなオブジェクトを作成します。

CGMutablePathRef pathRef = CGPathCreateMutable();

そして、次のように渡します。

self.flowView.pathToDraw = pathRef;

私のflowViewクラスには、それを解放するこのメソッドがあります。

-(void) setPathToDraw:(CGMutablePathRef) newPath {
    if(pathToDraw!=NULL) CGPathRelease(pathToDraw);
    pathToDraw=newPath;
    [self setNeedsDisplay];
}

私はすでにGCPathのドキュメントを見てみましたが、運がありませんでした。

ありがとう

4

2 に答える 2

2

はい、そのための拡張機能があります。

http://clang.llvm.org/docs/LanguageExtensions.html#objc_features

メソッドを次のように宣言できます。

- (void)setPathToDraw:(CGMutablePathRef) __attribute__((cf_consumed)) newPath

そして、Clangはこれを認識します(コールサイトから-実際に定義でそれを消費することを確認できません)。

これを定義するすべてのセレクターが、セレクター (名前) に適用した属性に準拠していることを確認する必要があります。

属性は危険です - 可能であれば慣例に固執し、動的ディスパッチを扱うときは特に注意することをお勧めします。これは、コンパイラが間違っている可能性がある ARC を使用した例です。コンパイラが間違っている場合は、あなたを助けようとしているツールに反対しているので、あなたもそうする可能性が高い.

IIRCconsumeは、私が使用した唯一の属性であり、静的ディスパッチでのみ使用します。

于 2012-03-22T04:48:25.807 に答える
1

通常の保持/解放の規則に従わないのはなぜですか? あなたが何を得たいと思っているのかわかりません。

保持と解放をもう 1 回呼び出しても、顕著なパフォーマンスの違いは発生せず、このコードを読む必要がある他の人にとってははるかに理解しやすいものになります。

CGMutablePathRef pathRef = CGPathCreateMutable();
self.flowView.pathToDraw = pathRef;
CGPathRelease(pathRef);

-(void) setPathToDraw:(CGMutablePathRef) newPath
{
    if (pathToDraw != newPath) {
        CGPathRelease(pathToDraw);
        pathToDraw=CGPathRetain(newPath);

        [self setNeedsDisplay];
    }
}

変な方法でやりたいと主張する場合、もう 1 つの方法は宣言で属性を使用することcf_consumedです。これは、通常とは異なることを行っていることをアナライザーに説明します。

于 2012-03-22T04:48:13.937 に答える