我使用手动引用计数、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
类型的某个属性的副本,它显示为 CFStringRef
的 CFArrayRef
。如果我理解正确,我负责释放数组中的 CFStringRef
和 CFArrayRef
本身。 (也许不是,所以如果我在这里错了,请告诉我)。
在桥接来自 CF 世界的 CFArrayRef
并将所有权转移给 ARC 之后,我知道 NSArray*
将由 ARC 处理。但是那个数组中的 CFStringRef
呢?它们桥接到 NSString*
(我知道,因为我可以使用 for..in
迭代元素),但我不确定是哪种类型的 __bridge*
应用于它。
根据我之前没有遇到过的经验,我猜测阵列上使用的是什么__bridge*
(__bridge
或__bridge_transfer
) ,相同的用于该数组中的元素。
这样对吗?同样,我在任何地方都找不到确认信息,所以如果您知道文档中指定它的地方,我将不胜感激任何有关它的信息。谢谢。
//得到答案后编辑
我没有意识到 CFArray
和 NSArray
都保留了它们的元素——在 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/