Objective c iOS网桥与网桥传输

Objective c iOS网桥与网桥传输,objective-c,ios,automatic-ref-counting,Objective C,Ios,Automatic Ref Counting,我把bridge和bridge\u transfer搞混了,对吗 -(void)getData{ ABAddressBookRef addressBook = ABAddressBookCreate(); NSArray *allPeople = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook); NSString *name; for ( int i = 0;

我把
bridge
bridge\u transfer
搞混了,对吗

-(void)getData{
    ABAddressBookRef addressBook = ABAddressBookCreate();
    NSArray *allPeople = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);

    NSString *name;
    for ( int i = 0; i < [allPeople count]; i++ )
    {
        name = (__bridge_transfer NSString *) ABRecordCopyValue((__bridge ABRecordRef)[allPeople objectAtIndex:i], kABPersonFirstNameProperty);
    }
    CFRelease(addressBook);
    allPeople = nil;
}
-(void)获取数据{
ABAddressBookRef addressBook=ABAddressBookCreate();
NSArray*allPeople=(u_u桥u传输NSArray*)abAddressBookCopyArrayFallPeople(addressBook);
NSString*名称;
for(int i=0;i<[allPeople count];i++)
{
name=(uuu bridge\u transfer NSString*)ABRecordCopyValue((uuu bridge ABRecordRef)[allPeople objectAtIndex:i],kabbersonfirstnameproperty);
}
CFRelease(通讯录);
所有人=零;
}

是否有人可以向我解释如何使用它们?

如果您打开了自动参考计数(ARC),则代码是正确的

在您的语句中有两个
\u桥接\u传输
。因此,创建的CFObjects的所有权将转移到NSObjects。如果已启用ARC,它们将自动释放。如果对这两条语句使用了
\u桥
,则需要显式调用
CFRelease
来释放由
*Copy
API创建的CFObjects


\u桥
语句也正确。因为您正在引用CF API中的NSObject。您没有转移所有权,因此ARC将释放它。

这非常简单,当您使用ARC(自动引用计数)时,编译器将负责计算变量指向的对象数量。当计数变为0时,对象将自动取消分配。所以对于来自底层结构的东西,比如核心基础,编译器不知道该怎么做。因此,如果您只想告诉编译器“忽略这一个,我会在需要时释放它”,那么就使用桥接器。或者桥接传输,如果您想说“将其视为对象,并在引用变为0时释放它”)

执行此操作时,您创建了一个副本,在正常情况下,该副本应通过“CFRelease”发布:

但是,通过添加此项,您将所有权转移到objective-c对象:

NSArray *allPeople = (__bridge_transfer NSArray*)........
因此,NSArray将由ARC管理


请注意,正如JRG提到的,这样做:

CFRelease(addressBook);
无论如何都不会影响新创建的对象,但会影响您仍然必须手动释放的原始对象:(很容易判断,因为这些方法的名称中通常包含创建复制关键字)



在代码中没有发生的事情,但你应该小心的是,释放CfRip的NULL核心基础对象会导致错误。正如保罗在他的评论中提到的。

< P>编辑:我认为调用一个NIL对象的CfReLIP确实会导致应用程序崩溃

< p> Luis Oscar,我还在解我的理解。f ARC,但我相信addressBook确实需要CFRelease。ARC不是在管理addressBook。NSArray*所有人都由ARC通过uuu bridge_transfer cast提示进行管理,并将其创建为原始人的副本。没有CFRelease,addressBook将泄漏。

所有权是内存管理中的一个重要关键概念。“所有者”“一个对象的属性负责释放它的内存。如果它不能做到这一点,对象将泄漏。但是,一个对象可以有多个所有者,因此在这种情况下,超出范围的最后一个所有者负责解除分配。ARC会自动执行此操作,但仅适用于objective-C对象。CoreFoundation对象是普通的C对象,因此您需要向编译器提示如何处理它们。如果您将所有权“转让”给ARC,则表示ARC有责任解除分配该对象。很抱歉,您的回复太晚。所有权主要是关于谁负责释放对象。如果您想了解详细信息,请参阅。与正常的
[nil release]
不同,
CFRelease(NULL)
会导致错误。是的,您是对的,“如果cf为NULL,这将导致运行时错误,您的应用程序将崩溃。”-1:
NSArray*allPeople=(\u bridge\u transfer NSArray*)abAddressBookCopyArrayFallPeople(addressBook)传输返回的数组的所有权。这与
地址簿
没有任何关系。相反,
addressBook
必须发布,因为它是用“create”方法创建的(
ABAddressBookCreate
)。否则,它会泄漏。@jrgdeveloper是的,你是正确的,谢谢你指出它。我不知道我当时在想什么。修正了答案。
CFRelease(addressBook);