3

分析器正在标记内存问题。通常我会使用自动释放,但这在 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);

核心基础参考

不再需要路径后使用 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

于 2013-07-29T09:28:35.660 回答
1

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

于 2013-07-29T10:21:28.177 回答
1

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

  1. 将方法从 重命名NewCGMutablePathRefCreateWithRoundedRectForRectCreateCGMutablePathRefWithRoundedRectForRect。重命名它的重要部分是方法以 开头Create,它告诉静态分析器您的方法返回一个需要释放的对象,并将停止您看到的警告。
  2. CGPathRef通过调用释放返回CGPathRelease
于 2013-07-29T10:40:11.943 回答
0
CGPathCloseSubpath(path);

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

于 2013-07-29T09:31:44.457 回答
0

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

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

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

…………………………………………………………………………………………

CFRelease(路径);

于 2013-07-29T09:41:18.610 回答