对于Core Foundation对象,CFRelease有什么好的替代方案?

时间:2011-10-12 01:35:32

标签: objective-c

我已经采用了以下代码,这些代码会在延迟后调用CFRelease。我已将其包含在上下文方法中。

CGPathRef NewPathWithRoundRect(CGRect rect, CGFloat cornerRadius)
{
     // other work to create ref which is a CGPath
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
        CFRelease(ref);
    });
}

在最新版本的Xcode中,我收到有关未正确释放内存的警告。调用者获取值,使用它然后调用CFRelease。我现在CFRetain它也CFRelease它,以便将引用计数降低到零我设置此调度运行并清理引用。

我对这种做法不满意。是否有更好的模式用于返回在方法中创建并需要返回的CF对象?我应该在方法之外创建路径并将其作为参数传递,以便由调用者创建和释放它吗?

我还将我的代码更改为调用CGPathRelease,这更安全一些。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

CoreFoundation策略是,如果函数中包含单词“Create”,则该函数返回一个拥有(或保留)对象,调用者负责释放该对象。因此,您的NewPathWithRoundRect方法应命名为CreatePathWithRoundRect,然后删除延迟的CFRelease。调用者将负责在完成后释放它。