- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用手动引用计数、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/
迈克·阿什说: When __bridge_transfer is used in a cast, it tells ARC that this object is already retained,
我正在访问地址簿并有这一行并且正在使用 ARC 进行编译: ABMultiValueRef phoneNums = ABRecordCopyValue(person, kABPersonPhoneP
假设一个方法通过指针返回一个CFErrorRef。此返回的错误可能是 NULL。那么,仍然执行 __bridge_transfer 是否安全,或者我是否应该检查 NULL。 例如 CFErrorRef
这个问题在这里已经有了答案: Where and how to __bridge (2 个答案) 关闭 9 年前。 谁能解释一下什么是“__bridge_transfer”和“_bridge”以及何
我使用手动引用计数、ARC 和 CF 对象已经有一段时间了,但是今天在使用 AddressBook API 时,我意识到我不明白一件事(我也无法在文档中找到解释) . 这是我的用例:我正在从 ABRe
我在 NSMutableArray 上收到此错误: -[Not A Type release]: message sent to deallocated instance 0x1006e29c0
我正在使用 ARC,并且在使用 __bridge_transfer 时感到困惑。我有一个属性 userName 如下: @property (nonatomic, retain) NSString *
我正在为标准 C API 编写 Obj-C 包装器。我想用 block 替换 C 回调。 让我们想象一个 C API: void my_async_function(void (* callback)
我是一名优秀的程序员,十分优秀!