分析仪正在标记内存问题。通常我会使用自动释放,但这在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;
}
按照建议添加发布路径代码后,我得到另一个错误加上原来的错误?
答案 0 :(得分:4)
CFRelease(path);
在您不再需要路径后使用CFRelease。
CGMutablePathRef path = [obj NewCGMutablePathRefCreateWithRoundedRectForRect:rect andRadius:radius andMargin:margin andrIndent:rIndent andlIndent:lIndent];
//do something with path, then release it
CFRelease(path);
另一件事是返回未自动释放的对象的方法必须以:
开头所以你应该为你的方法命名: newCGMutablePathRefCreateWithRoundedRectForRect 代替: NewCGMutablePathRefCreateWithRoundedRectForRect
答案 1 :(得分:1)
在外部创建路径,并尝试在方法中仅传递此路径的引用。然后,您可以在调用方法的同一范围内释放路径。内存泄漏问题将消失。
答案 2 :(得分:1)
通过两个简单的步骤解决此问题:
NewCGMutablePathRefCreateWithRoundedRectForRect
重命名为CreateCGMutablePathRefWithRoundedRectForRect
。重命名它的重要部分是该方法以Create
开头,它告诉静态分析器您的方法返回一个需要释放的对象,并将停止您所看到的警告。CGPathRef
释放已退回的CGPathRelease
。答案 3 :(得分:0)
CGPathCloseSubpath(path);
在返回变量path
之前添加此代码。
答案 4 :(得分:0)
使用完后释放路径变量。例如:
在代码中的某些其他方法中,您将使用此路径rt?
说
CGMutablePathRef path = [obj NewCGMutablePathRefCreateWithRoundedRectForRect:rect andRadius:radius andMargin:margin andrIndent:rIndent andlIndent:lIndent];
....... .......
CFRelease(路径);