【问题标题】:What is a good alternative to CFRelease for Core Foundation objects?对于 Core Foundation 对象,什么是 CFRelease 的良好替代品?
【发布时间】:2011-10-12 01:35:32
【问题描述】:

我已采用以下代码,该代码将在延迟后调用 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,这更安全一些。任何建议表示赞赏。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-26
      • 2019-11-27
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 2011-10-16
      相关资源
      最近更新 更多