我已经使用过手动引用计数,ARC和CF对象一段时间了,但今天在使用AddressBook API时,我意识到我不明白一件事(我也无法在文档中找到解释)。__bridge_transfer从CFArrayRef NSArray * - 是否传递元素?
这是我的用例:我从ABRecordRef
复制ABMultiValueRef
属性(以获取所有元素)。
ABMultiValueRef multiString = ABRecordCopyValue(personRef, propertyID);
NSArray* multiValues = (__bridge_transfer NSArray *)ABMultiValueCopyArrayOfAllValues(multiString);
CFRelease(multiString);
//do something with the multiValues NSArray
所以我就呈现本身作为CFStringRef
的CFArrayRef
A S kABMultiStringPropertyType
类型的某个属性的副本。如果我理解正确,我有责任释放阵列中的CFStringRef
和CFArrayRef
本身。 (也许不是,如果我在这里错了,请让我知道)。
在从CF世界桥接CFArrayRef
并将所有权转让给ARC后,我知道NSArray*
将由ARC负责处理。但是那个阵列里面的CFStringRef
呢?他们桥接到NSString*
(我知道,因为我可以用for..in
迭代元素),但我不确定__bridge*
应用于哪种类型。
从经验和我以前没有遇到过,我猜想无论使用__bridge*
(__bridge
或__bridge_transfer
)在数组上,同一个用于该数组中的元素。
这是正确的吗?再一次,我无法在任何地方找到确认,所以如果您在指定它的文档中知道某个地方,我将不胜感激关于它的任何信息。谢谢。得到答案
后
//编辑我不知道这两个CFArray
和NSArray
保留它们的元素 - 这就是以下的情况下在CF和对象世界,所以没有什么有__bridge*
期间改变。转移后,NSArray
由ARC负责处理,其元素由阵列自行处理。所以当ARC发布数组时,数组会释放它的元素(所以ARC不需要知道元素的任何内容)。
桥指令只是提供以下资料:它应该做的相对保留和释放提供ARC。在CFArray和NSArray中,删除时添加和释放时都会保留对象,因此ARC不会对它们执行任何操作。我想不出任何桥梁影响两个物体以外的任何情况。 –