核心图形内存泄漏

时间:2013-07-29 09:22:02

标签: ios memory-leaks core-graphics

分析仪正在标记内存问题。通常我会使用自动释放,但这在Core Foundation中是不可能的。如何解决此错误?

Screen shot of error

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

按照建议添加发布路径代码后,我得到另一个错误加上原来的错误?

additional screen shot

5 个答案:

答案 0 :(得分:4)

CFRelease(path);

CoreFoundation reference

在您不再需要路径后使用CFRelease。

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

另一件事是返回未自动释放的对象的方法必须以:

开头
  • 的alloc
  • 复制
  • new
  • 保留

所以你应该为你的方法命名: newCGMutablePathRefCreateWithRoundedRectForRect 代替: NewCGMutablePathRefCreateWithRoundedRectForRect

答案 1 :(得分:1)

在外部创建路径,并尝试在方法中仅传递此路径的引用。然后,您可以在调用方法的同一范围内释放路径。内存泄漏问题将消失。

答案 2 :(得分:1)

通过两个简单的步骤解决此问题:

  1. 将方法从NewCGMutablePathRefCreateWithRoundedRectForRect重命名为CreateCGMutablePathRefWithRoundedRectForRect。重命名它的重要部分是该方法以Create开头,它告诉静态分析器您的方法返回一个需要释放的对象,并将停止您所看到的警告。
  2. 通过致电CGPathRef释放已退回的CGPathRelease

答案 3 :(得分:0)

CGPathCloseSubpath(path);

在返回变量path之前添加此代码。

答案 4 :(得分:0)

使用完后释放路径变量。例如:

在代码中的某些其他方法中,您将使用此路径rt?

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

....... .......

CFRelease(路径);