- 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/
我正在尝试使用内置方法将一个 iPhone 联系人转换为 vCard。文档说要使用: ABPersonCreateVCardRepresentationWithPeople(CFArrayRef pe
我有清除设备中地址簿的方法。方法如下。 -(void) clearAdressBook { ABAddressBookRef addrBook=ABAddressBookCreate();
我通过桥接头在我的 Swift 项目中使用 Objective-C 类。方法签名看起来像这样: - (CFArrayRef)someMethod:(someType)someParameter; 我首
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How to make an CFArrayRef to an NSMutableArray 我知道有很多关
这是我创建 CFArrayRef 的代码。我想知道如何将它变成 NSMutableArray。我的 TableViewController 需要它。或者有其他方法可以在 TableViewContro
我使用手动引用计数、ARC 和 CF 对象已经有一段时间了,但是今天在使用 AddressBook API 时,我意识到我不明白一件事(我也无法在文档中找到解释) . 这是我的用例:我正在从 ABRe
这很好: CFArrayRef windowList = CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly, kCGNullWind
我是跨平台编程的新手。我在这里遇到一个问题,但由于在线帮助非常有限(或者可能是我不知道在哪里搜索),我找不到解决方案。 问题是:我想将 CFArrayRef 转换为 C++/C 中可用的格式我有一个
我有一个 ARC 项目,正在尝试绘制垂直线性渐变。下面的代码适用于模拟器,但在设备上测试时会抛出内存/EXC_BAD_ACCESS 错误。该应用程序因以下两行代码而崩溃: NSArray *color
假设我有一个包含 CFStringRefs 的 CFArrayRef,我使用 CFBridgingRelease() 将它桥接到 NSArray。我现在可以将数组的内容视为常规 NSString 实例
我是一名优秀的程序员,十分优秀!