gpt4 book ai didi

ios - __bridge_transfer 从 CFArrayRef 到 NSArray* - 元素也转移了吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:58 26 4
gpt4 key购买 nike

我使用手动引用计数、ARC 和 CF 对象已经有一段时间了,但是今天在使用 AddressBook API 时,我意识到我不明白一件事(我也无法在文档中找到解释) .

这是我的用例:我正在从 ABRecordRef 复制一个 ABMultiValueRef 属性(以获取所有元素)。

ABMultiValueRef multiString = ABRecordCopyValue(personRef, propertyID);
NSArray* multiValues = (__bridge_transfer NSArray *)ABMultiValueCopyArrayOfAllValues(multiString);
CFRelease(multiString);

//do something with the multiValues NSArray

所以我得到了 kABMultiStringPropertyType 类型的某个属性的副本,它显示为 CFStringRefCFArrayRef。如果我理解正确,我负责释放数组中的 CFStringRefCFArrayRef 本身。 (也许不是,所以如果我在这里错了,请告诉我)。

在桥接来自 CF 世界的 CFArrayRef 并将所有权转移给 ARC 之后,我知道 NSArray* 将由 ARC 处理。但是那个数组中的 CFStringRef 呢?它们桥接到 NSString*(我知道,因为我可以使用 for..in 迭代元素),但我不确定是哪种类型的 __bridge* 应用于它。

根据我之前没有遇到过的经验,我猜测阵列上使用的是什么__bridge*(__bridge__bridge_transfer) ,相同的用于该数组中的元素。

这样对吗?同样,我在任何地方都找不到确认信息,所以如果您知道文档中指定它的地方,我将不胜感激任何有关它的信息。谢谢。

//得到答案后编辑

我没有意识到 CFArrayNSArray 都保留了它们的元素——在 CF 和对象世界中都是这种情况,所以在 __桥*。传输后,NSArray 由 ARC 处理,其元素由数组本身处理。因此,当 ARC 释放数组时,数组也会释放其元素(因此 ARC 不需要知道有关元素的任何信息)。

最佳答案

__bridge_transfer__bridge “只是”类型转换加上可选的所有权转移。数组本身没有被 brigde 修改,并且数组元素根本不会改变。

所以你不负责释放数组元素。该阵列保留其元素(ARC 说:保留强引用),并释放它们(删除强引用)当元素从数组中移除时。

只有当你显式地转移一个数组元素的所有权时,你负责发布它:

CFStringRef s = (__bridge_retain CFStringRef) multiValues[0];
// …
CFRelease(s);

关于ios - __bridge_transfer 从 CFArrayRef 到 NSArray* - 元素也转移了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20542844/

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