沉默关于释放CGMutablePathRef对象的编译器警告

时间:2012-03-22 04:36:08

标签: objective-c xcode clang-static-analyzer

我启用了静态分析器,但它告诉我在该执行路径的末尾该对象没有被释放,因此可能导致内存泄漏。然而,我将对已创建对象的引用传递给另一个将释放它的类。我想知道是否有一个方法或关键字告诉编译我稍后会释放这个对象。

我正在寻找像自动释放这样的东西。

顺便说一下,我正在使用ARC。

我创建了这样的对象:

CGMutablePathRef pathRef = CGPathCreateMutable();

并按照这样传递:

self.flowView.pathToDraw = pathRef;

在我的flowView类中,我有这个方法可以释放它。

-(void) setPathToDraw:(CGMutablePathRef) newPath {
    if(pathToDraw!=NULL) CGPathRelease(pathToDraw);
    pathToDraw=newPath;
    [self setNeedsDisplay];
}

我已经尝试过查看GCPath文档,但我没有运气。

由于

2 个答案:

答案 0 :(得分:2)

是的,有一个扩展名:

http://clang.llvm.org/docs/LanguageExtensions.html#objc_features

您可以将方法声明为:

- (void)setPathToDraw:(CGMutablePathRef) __attribute__((cf_consumed)) newPath

然后Clang会认识到这一点(来自callsite - 它无法检查你确实在定义中使用它。)

您需要确保每个定义此选项的选择器都符合您为选择器(名称)应用的属性。

属性是有风险的 - 我建议尽可能坚持惯例,并在处理动态调度时要格外小心。 Here's an example using ARC where the compiler can get it wrong。如果编译器弄错了,那么你也有机会,因为你正在努力反对那些试图帮助你的工具。

IIRC,consume是我使用过的唯一属性,我只使用静态调度。

答案 1 :(得分:1)

为什么不遵循正常的保留/发布惯例?我不明白你希望获得什么。

保留和释放的另一个调用会产生明显的性能差异,对于任何需要阅读此代码的人来说,这将更容易理解。

CGMutablePathRef pathRef = CGPathCreateMutable();
self.flowView.pathToDraw = pathRef;
CGPathRelease(pathRef);

-(void) setPathToDraw:(CGMutablePathRef) newPath
{
    if (pathToDraw != newPath) {
        CGPathRelease(pathToDraw);
        pathToDraw=CGPathRetain(newPath);

        [self setNeedsDisplay];
    }
}

如果你坚持以奇怪的方式去做,另一个选择是use the cf_consumed attribute in your declaration。这向分析仪解释了你正在做一些与众不同的事情。