什么是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,这有点安全。任何建议表示赞赏。
答
CoreFoundation策略是,如果一个函数在其中包含“Create”一词,那么该函数将返回一个拥有(或保留)的对象,调用者负责释放该对象。所以你的NewPathWithRoundRect
方法应该被命名为CreatePathWithRoundRect
,然后放下延迟的CFRelease。调用者将负责在完成它时释放它。
+0
这样做的工作。谢谢! – Brennan
为什么会有延迟? – zaph