当我需要返回它时如何释放这个 CGPath

Posted

技术标签:

【中文标题】当我需要返回它时如何释放这个 CGPath【英文标题】:How do I release this CGPath when I need to return it 【发布时间】:2010-12-19 07:03:54 【问题描述】:

我有一个返回 CGMutablePathRef 的方法,如下所示:

- (CGMutablePathRef)somePath;  
  
    CGMutablePathRef theLine = CGPathCreateMutable(); 

    CGPathMoveToPoint(theLine, NULL, 50, 50);  
    CGPathAddLineToPoint(theLine, NULL, 160, 480);  
    CGPathAddLineToPoint(theLine, NULL, 270, 50);

    return theLine;  
  

Xcode/Clang 静态分析器警告存在潜在泄漏。文档说要调用 CGPathRelease() 但我会把它放在哪里?

如果我把它放在方法返回之前,那会不会导致 theLine 在它返回给它的调用者之前消失?

【问题讨论】:

你还在为 Xcode/Clang 向你抱怨而烦恼吗? 和你一样的问题,还在寻找答案。 【参考方案1】:

如果方法名称以 new 开头,clang 将期望它返回一个保留计数为 1 的对象。换句话说,将方法从 somePath 重命名为 newSomePath 将使分析器安静。

如果你真的想自动释放 CGPathRef,你可能可以将它转换为 NSObject,然后调用 autorelease。我知道这适用于 CFTypes,老实说,我不确定 CGPathRef 是否符合条件。

【讨论】:

也为我工作!非常感谢。 太糟糕了,这不适用于返回 CG 对象的 C 函数。 :( @Pascal 分析器是否在抱怨 C 函数?这些也有命名约定。我认为包含CopyCreate 的名称预计会返回保留的项目。 太棒了,使用create... 作为函数名成功了,谢谢! @benzado 谢谢你救了我。在我的 C 函数上使用 create 就像一个魅力。这是特定于 Apple 的编译器还是一般的 C?【参考方案2】:

如何创建一个可变路径,将其传递给您的构建函数,然后使用和释放它:

CGMutablePathRef mPath = CGPathCreateMutable();
[buildPath:mPath]; //adds reusable lines etc
...do something with it...
CGPathRelease(mPath);

【讨论】:

以上是关于当我需要返回它时如何释放这个 CGPath的主要内容,如果未能解决你的问题,请参考以下文章

缩放 CGPath 以适应 UIVIew

查找 CGPath 的方向/缠绕方向

如何将文件保存在路径中并使用 ../../ 从不同的路径 PHP 访问它

缩放CGPath以适应UIVIew

如何自动释放 CGColorRef

从多个 CGpath 构建 CAShapeLayer