objective-c - 在 Core Foundation 中保留和 "autoreleasing"

标签 objective-c c core-foundation

假设我正在编写自己的函数,它接受一个 CFDataRef 对象,对其执行一些操作,然后返回另一个 CFDataRef 对象:

CFDataRef transformData(CFDataRef inData)
{
  //Question 1: Should I call CFRetain(data) here to make sure it doesn't
  //go away? (This of course would involve releasing data just before returning
  //from this function, or as soon as I no longer need data.)

  CFDataRef outData;

  //Somehow produce the new outData from inData (and assume we are the
  //owner of outData, since we created it right here).

  //Question 2: What, if anything, should I do with outData before
  //returning it? I'm unsure of this, because CF doesn't have any
  //autoreleasing mechanism.

  return outData;
}

如您所见,我有两个问题,它们都包含在上面的代码中。

最佳答案

对于问题 1:将它保留在顶部并稍后释放它的唯一原因是线程安全,如果您从一个线程被调用而另一个线程释放了数据的最后所有权,但那赢了't help:即使您保留了该对象,释放也可能在此之前发生,甚至在您被调用之前发生,在这种情况下,问题仍然会发生并且您只会使它变得更加罕见。所以我说不用担心。

对于问题 2:将您的函数重命名为 CreateDataByTransformingData。然后,根据CF memory-management rules ,您的函数返回调用者必须释放的所有权。

问题 2 的替代解决方案:转换到 NSData * 并向其发送 autorelease 消息。 (这要求您使用 MRC,而不是 ARC,至少对于这个模块/类。)

[2013 年 11 月 1 日添加] 替代替代解决方案:需要 OS X 10.9 或更高版本并使用 the new CFAutorelease function .

关于objective-c - 在 Core Foundation 中保留和 "autoreleasing",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8627848/

相关文章:

c - Linux 的动态链接器 : how to call a function from the main process from an . 所以对象?

c - 信号处理程序不工作

c - 带约束的迷宫求解

objective-c - LSSetDefaultRoleHandlerFor 优胜美地中的内容类型

iphone - 如何优化我的 Controller 以使其加载速度更快?

ios - 滑动删除 UITableViewCell 很难触发

objective-c - RestKit 对象映射失败取决于属性名称

c++ - 从 C++ 调用 Objective-C 类方法

c - 像 C 中的 NSTimer 一样重复函数调用

objective-c - 我的系统拒绝使用 NSAppleScript 类关闭/重启