假设我正在编写自己的函数,该函数接受一个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/