我有一个方法可以创建一个返回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提供的答案即“新“规则确实是我提出的问题的正确答案:)谢谢!
答案 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
我不能说我推荐它!