我对bridgebridge_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;
}

有谁可以向我解释如何使用它们?

最佳答案

如果您打开了自动引用计数(ARC),则代码正确。

语句中有两个__bridge_transfer。结果,创建的CFObject的所有权将转移到NSObjects。如果您打开了ARC,它们将自动释放。如果您对这2条语句使用__bridge代替,则需要显式调用CFRelease以释放由*Copy API创建的CFObject。
__bridge语句也是正确的。因为您在CF API中引用了NSObject。您没有转让所有权,因此ARC将其释放。

07-26 00:59