4

我有一个创建返回CoreGraphics对象实例的方法 - CGPathRef

当我通过 Analyzer 运行该应用程序时,它抱怨此方法正在泄漏......它是,但它是故意的。我确实想将所有权转移给调用者并让他们清理。

我能做些什么来抑制这个分析器警告?

- (CGPathRef) createSomePath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle
{
  CGMutablePathRef slicePath = CGPathCreateMutable();

  ....

  return slicePath;  <--- Analyzer points to this line as a potential leak.
}

假设这应该是可能的,因为许多框架返回这些需要调用者清理的对象......

提前致谢 !

PS恐怕这个问题不是一个重复问题,也没有其他任何地方的正确答案......本页顶部突出显示的3个答案不正确/不完整......只有Matthias Bauch在此处提供的答案,即“新”规则确实是我提出的问题的正确答案:) 谢谢!

4

2 回答 2

10

CoreFoundation 函数遵循“创建规则”。如果函数中有一个“创建”,它会返回一个引用计数为 1 的对象。

不幸的是,您的方法不是 ac 功能。

所以你应该把你的 Objective-C 方法变成一个 C 函数。像这样的东西:

CGPathRef CreatePath(CGPoint center, CGFloat innerRadius, CGFloat outerRadius, CGFloat startAngle, CGFloat endAngle) {
    // your code here
}

这应该使分析器满意并与 ARC 一起正常工作。

在 Objective-C 方法中,您可以通过以 、new或开头alloccopymutableCopy的方法签名来获得类似的行为。开始该方法new可能最适合您的情况。
像这样的东西应该会让分析器满意,但我不确定它是否与 ARC 一起正常工作。您必须对此进行分析。

- (CGPathRef)newPath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle {
    // your code here
}
于 2013-06-25T19:06:51.503 回答
0

你应该能够做到这一点:

#ifndef __clang_analyzer__
CGMutablePathRef slicePath = CGPathCreateMutable();
#endif

我不能说我推荐它!

于 2013-06-25T18:13:56.353 回答