2012-03-22 89 views
4

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

我正在寻找类似自动释放的东西。

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

我创建这样的对象:

CGMutablePathRef pathRef = CGPathCreateMutable(); 

,并将它传递这样的:

self.flowView.pathToDraw = pathRef; 

在我flowView类我有这样的方法,将其释放。

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

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

谢谢

回答

2

是的,有针对的扩展:

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

你可以宣布你的方法为:

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

然后锵将认识到这一点(从调用点 - 失败检查你是否确实在定义中使用它)。

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

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

IIRC,consume是我用过的唯一属性,我专门用静态分派。

+1

谢谢,这工作。 – Pochi 2012-03-22 05:21:31

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。这解释了分析仪,你正在做一些不寻常的事情。

+0

这是我尝试的第一件事,但是如果我在那里释放它,运行时会出现内存访问错误。 – Pochi 2012-03-22 05:15:42

+0

然后你可能会在代码中的其他地方获得另一个额外的版本。希望你找到它! – 2012-03-23 00:30:02