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

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

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

[已添加2013-11-01]备用备用解决方案:要求OS X 10.9或更高版本并使用新的CFAutoreleasefunction 。