假设我正在编写自己的函数,该函数接受一个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:将其保留在顶部并在以后释放的唯一原因是线程安全,在这种情况下,您从一个线程被调用而另一个线程释放了数据的最后所有权,但这无济于事:即使保留对象,释放也可能在此之前甚至在您被调用之前发生,在这种情况下问题仍然会发生,并且只会使它变得更罕见。所以我说不用担心。

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

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

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

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

10-15 15:53