假设我正在编写自己的函数,该函数接收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;
}
如您所见,我有两个问题,它们包含在上面的代码中。
答案 0 :(得分:7)
对于问题1:将其保留在顶部并稍后将其释放的唯一原因是线程安全,如果您从一个线程调用而另一个线程释放数据的最后一个所有权,但是赢了没有帮助:即使你保留了这个对象,释放可能会在那之前,甚至在你被叫之前发生,在这种情况下,问题仍然会发生,而你只是变得更加罕见。所以我说不要担心。
问题2:将您的功能重命名为CreateDataByTransformingData
。然后,根据CF内存管理rules,您的函数返回调用者必须释放的所有权。
问题2的替代解决方案:转换为NSData *
并向其发送autorelease
消息。 (这要求您使用MRC,而不是ARC,至少对于此模块/类。)
[已添加2013-11-01]备用替代解决方案:需要OS X 10.9或更高版本并使用the new CFAutorelease
function。