2013-12-12 25 views
2

我已经使用过手动引用计数,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 

所以我就呈现本身作为CFStringRefCFArrayRef A S kABMultiStringPropertyType类型的某个属性的副本。如果我理解正确,我有责任释放阵列中的CFStringRefCFArrayRef本身。 (也许不是,如果我在这里错了,请让我知道)。

在从CF世界桥接CFArrayRef并将所有权转让给ARC后,我知道NSArray*将由ARC负责处理。但是那个阵列里面的CFStringRef呢?他们桥接到NSString*(我知道,因为我可以用for..in迭代元素),但我不确定__bridge*应用于哪种类型。

从经验和我以前没有遇到过,我猜想无论使用__bridge*__bridge__bridge_transfer)在数组上,同一个用于该数组中的元素。

这是正确的吗?再一次,我无法在任何地方找到确认,所以如果您在指定它的文档中知道某个地方,我将不胜感激关于它的任何信息。谢谢。得到答案

//编辑我不知道这两个CFArrayNSArray保留它们的元素 - 这就是以下的情况下在CF和对象世界,所以没有什么有__bridge*期间改变。转移后,NSArray由ARC负责处理,其元素由阵列自行处理。所以当ARC发布数组时,数组会释放它的元素(所以ARC不需要知道元素的任何内容)。

+0

桥指令只是提供以下资料:它应该做的相对保留和释放提供ARC。在CFArray和NSArray中,删除时添加和释放时都会保留对象,因此ARC不会对它们执行任何操作。我想不出任何桥梁影响两个物体以外的任何情况。 –

回答

2

__bridge_transfer__bridge是“仅”类型转换加上可选的所有权转移。 阵列本身没有被brigde修改,而阵列 元素根本没有改变。

所以你不负责释放数组元素。该阵列保留其 元素(ARC说:保留强引用),并在元素从阵列中删除时释放它们(删除 强引用)。

只有当你明确地传递一个数组元素的所有权你 负责释放它:

CFStringRef s = (__bridge_retain CFStringRef) multiValues[0]; 
// … 
CFRelease(s); 
+0

当然。出于某种原因,我没有意识到数组需要保留其元素,这意味着当ARC释放数组时,数组“手动”释放其元素。这解释了我的问题,谢谢。 – czechboy