什么是CFRelease for Core Foundation对象的好替代方案?

问题描述:

我采取了以下代码,延迟后会调用CFRelease。我已经将它包含在上下文的方法中。什么是CFRelease for Core Foundation对象的好替代方案?

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,这有点安全。任何建议表示赞赏。

+0

为什么会有延迟? – zaph

CoreFoundation策略是,如果一个函数在其中包含“Create”一词,那么该函数将返回一个拥有(或保留)的对象,调用者负责释放该对象。所以你的NewPathWithRoundRect方法应该被命名为CreatePathWithRoundRect,然后放下延迟的CFRelease。调用者将负责在完成它时释放它。

+0

这样做的工作。谢谢! – Brennan