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

标签 ios objective-c arrays abaddressbook

我使用手动引用计数、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/

相关文章:

ios - 无法将 scaleTimeRange 应用于 AVMutableComposition 视频中的多个视频

本地化的 iOS 应用程序图标

ios - 何时调用 monitoringDidFailForRegion 方法?

javascript - AngularJS:如何创建一个模型来保存输入字段动态列表的数组?

ios - Swift - UITableViewCell 具有自定义类和原型(prototype),在第四个单元格后重复

iphone - 归档后 XCode 4 Project Navigator 中丢失的文件

iphone - CAEmitterLayer 非常慢

iphone - 当 iPad 日期时间设置更改时通知应用程序

java - 在JAVA中的特定位置写入JSON文件

javascript - 将3个对象转为多维数组