抑制XCode Analyzer存储在..错误中的对象的潜在泄漏

时间:2013-06-25 18:06:04

标签: objective-c xcode analyzer

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

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

如何抑制此 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.
}

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

提前致谢!

P.S。我担心这个问题不是重复,也没有其他地方没有正确的答案......本页顶部突出显示的3个答案不正确/完整......只有Matthias Bauch提供的答案即“新“规则确实是我提出的问题的正确答案:)谢谢!

2 个答案:

答案 0 :(得分:10)

CoreFoundation函数遵循"create rule"。如果函数中包含“Create”,则返回引用计数为1的对象。

不幸的是,您的方法不是c函数。

因此,您应该将Objective-C方法转换为C函数。像这样:

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

这应该取悦分析仪并与ARC一起正常工作。

在Objective-C方法中,您可以通过new, alloc, copy or mutableCopy启动方法签名来获得类似的行为。使用new启动方法可能最适合您的情况 这样的东西应该取悦分析仪,但我不确定它是否能正常使用ARC。你必须对此进行分析。

- (CGPathRef)newPath:(CGPoint)center innerRadius:(CGFloat)innerRadius outerRadius:(CGFloat)outerRadius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle {
    // your code here
}

答案 1 :(得分:0)

你应该可以这样做:

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

我不能说我推荐它!