3

アナライザーがメモリの問題にフラグを立てています。通常は autorelease を使用しますが、これは Core Foundation では不可能です。このエラーを修正するにはどうすればよいですか?

エラーのスクリーンショット

- (CGMutablePathRef)NewCGMutablePathRefCreateWithRoundedRectForRect:(CGRect)rect andRadius:(CGFloat)radius andMargin:(CGFloat)margin andrIndent:(CGFloat)rIndent andlIndent:(CGFloat)lIndent
{
CGMutablePathRef path = CGPathCreateMutable();

CGPathMoveToPoint(path, NULL, CGRectGetMidX(rect), CGRectGetMinY(rect) + margin);
CGPathAddArcToPoint(path, NULL, CGRectGetMaxX(rect) - margin - rIndent, CGRectGetMinY(rect) + margin, CGRectGetMaxX(rect) - margin - rIndent, CGRectGetMaxY(rect) - margin, radius);
CGPathAddArcToPoint(path, NULL, CGRectGetMaxX(rect) - margin - rIndent, CGRectGetMaxY(rect) - margin, CGRectGetMinX(rect) + margin + lIndent, CGRectGetMaxY(rect) - margin, radius);
CGPathAddArcToPoint(path, NULL, CGRectGetMinX(rect) + margin + lIndent, CGRectGetMaxY(rect) - margin, CGRectGetMinX(rect) + margin + lIndent, CGRectGetMinY(rect) + margin, radius);
CGPathAddArcToPoint(path, NULL, CGRectGetMinX(rect) + margin + lIndent, CGRectGetMinY(rect) + margin, CGRectGetMaxX(rect) - margin, CGRectGetMinY(rect) +margin, radius);
CGPathCloseSubpath(path);


return path;
}

提案どおりにリリース パス コードを追加した後、別のエラーと元のエラーが表示されますか?

追加のスクリーンショット

4

5 に答える 5

4
CFRelease(path);

CoreFoundation リファレンス

パスが不要になったら CFRelease を使用してください。

CGMutablePathRef path = [obj NewCGMutablePathRefCreateWithRoundedRectForRect:rect andRadius:radius andMargin:margin andrIndent:rIndent andlIndent:lIndent];
//do something with path, then release it
CFRelease(path);

もう 1 つのことは、自動解放されないオブジェクトを返すメソッドは、次のことから始める必要があります。

  • 割り当てる
  • コピー
  • 新着
  • 保持

そのため、メソッドに次の名前を付ける必要があります: NewCGMutablePathRefCreateWithRoundedRectForRect の代わりに

于 2013-07-29T09:28:35.660 に答える
1

この問題を 2 つの簡単な手順で解決するには:

  1. メソッドの名前を からNewCGMutablePathRefCreateWithRoundedRectForRectに変更しCreateCGMutablePathRefWithRoundedRectForRectます。名前を変更する際の重要な部分は、メソッドが で始まることです。これにより、メソッドCreateが解放する必要があるオブジェクトを返すことを静的アナライザーに伝え、表示されている警告を停止します。
  2. CGPathRefを呼び出して、返された を解放しCGPathReleaseます。
于 2013-07-29T10:40:11.943 に答える
0

使用が終了したら、パス変数を解放します。例:

コード内の他のメソッドでは、このパス rt を使用しますか?

いう

CGMutablePathRef path = [obj NewCGMutablePathRefCreateWithRoundedRectForRect:rect andRadius:radius andMargin:margin andrIndent:rIndent andlIndent:lIndent];

………………

CFRelease(パス);

于 2013-07-29T09:41:18.610 に答える