我启用了静态分析器,但它告诉我在该执行路径的末尾该对象没有被释放,因此可能导致内存泄漏。然而,我将对已创建对象的引用传递给另一个将释放它的类。我想知道是否有一个方法或关键字告诉编译我稍后会释放这个对象。
我正在寻找像自动释放这样的东西。
顺便说一下,我正在使用ARC。
我创建了这样的对象:
CGMutablePathRef pathRef = CGPathCreateMutable();
并按照这样传递:
self.flowView.pathToDraw = pathRef;
在我的flowView类中,我有这个方法可以释放它。
-(void) setPathToDraw:(CGMutablePathRef) newPath {
if(pathToDraw!=NULL) CGPathRelease(pathToDraw);
pathToDraw=newPath;
[self setNeedsDisplay];
}
我已经尝试过查看GCPath文档,但我没有运气。
由于
答案 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。这向分析仪解释了你正在做一些与众不同的事情。