gpt4 book ai didi

objective-c - 在 Core Foundation 中保留和 "autoreleasing"

转载 作者:行者123 更新时间:2023-12-04 02:42:29 26 4
gpt4 key购买 nike

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

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

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com