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