在Core Foundation中保留和“自动释放”

时间:2011-12-25 01:52:36

标签: 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 个答案:

答案 0 :(得分:7)

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

问题2:将您的功能重命名为CreateDataByTransformingData。然后,根据CF内存管理rules,您的函数返回调用者必须释放的所有权。

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

[已添加2013-11-01]备用替代解决方案:需要OS X 10.9或更高版本并使用the new CFAutorelease function