2012-03-22 4 views
4

スタティックアナライザーを有効にしましたが、実行パスの最後にそのオブジェクトが解放されず、メモリリークの原因となる可能性があります。私はしかし、作成されたオブジェクトへのその参照を別のクラスに渡して、それを解放します。私は、後でこのオブジェクトをリリースすることをコンパイルに指示するメソッドまたはキーワードがあるかどうか疑問に思っていました。CGMutablePathRefオブジェクトを解放することについての警告を無音で返します。

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

ところで、私はARCを使用しています。

私はこのようなオブジェクトの作成:

CGMutablePathRef pathRef = CGPathCreateMutable(); 

をそして、このようにそれを渡す:私はそれを解放します。このメソッドを持っている私たFlowViewクラスで

self.flowView.pathToDraw = pathRef; 

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

私はすでにGCPathのドキュメントを見てみましたが、運がなかったのです。

ありがとうございました

答えて

2

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

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

はあなたのようにあなたの方法を宣言することがあります。

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

、その後クランは、呼び出し場所から(これを認識します - それは失敗しますあなたが実際にそれを定義内で消費していることを確認する)。

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

属性は危険です。可能であれば慣習に従うことと、動的ディスパッチを扱う際は特に注意することをおすすめします。 Here's an example using ARC where the compiler can get it wrong。コンパイラが間違っている場合は、あなたを助けようとしているツールに反対しているので、チャンスはあなたも良いでしょう。

IIRC、consumeは私が使用している唯一の属性であり、静的ディスパッチでのみ使用します。

+1

ありがとう、これは働いた。 – Pochi

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]; 
    } 
} 

あなたはそれを奇妙な方法を行う上で主張する場合、他の代替はuse the cf_consumed attribute in your declarationにあります。これはアナライザーにあなたが何か普通のことをしていることを説明します。

+0

これは私が試した最初のものですが、私がそこにリリースすれば、実行時にメモリアクセスエラーが発生します。 – Pochi

+0

次に、あなたのコードのどこかに別のリリースがある可能性があります。あなたがそれを見つけることを願って! –

関連する問題