【问题标题】:Nested bridge transfer call with ARC使用 ARC 的嵌套桥接转移呼叫
【发布时间】:2013-12-03 06:10:54
【问题描述】:

我正在尝试获取联系人的电子邮件地址和电子邮件地址的类型(工作/家庭)。这是我写的代码

//Assume that 'personRef' of type ABRecordRef is available
....
ABMultiValueRef emailRef = ABRecordCopyValue(personRef, kABPersonEmailProperty);
NSMutableArray *emailAddresses = nil, *emailAddressLabels = nil;
int ctr = ABMultiValueGetCount(emailRef);
if(ctr!=0) {
    emailAddresses = [[NSMutableArray alloc]init];
    emailAddressLabels = [[NSMutableArray alloc]init];
    for(int i=0; i<ctr; i++) {
        NSString *eId = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(emailRef, i);
        [emailAddresses addObject:eId];
        CFStringRef label = ABMultiValueCopyLabelAtIndex (emailRef, i);
        if(label!=NULL) {
            NSString *eType = (__bridge_transfer NSString*)ABAddressBookCopyLocalizedLabel(label);
            if([eType isEqualToString:@""]) {
                [emailAddressLabels addObject:@"Email"];
            } else {
                [emailAddressLabels addObject:eType];
            }
            CFRelease(label);
        }
    }
}

代码在 CFRelease(label) 处崩溃,但为了防止内存泄漏,我应该这样做。当我尝试以下操作时

NSString *eType = (__bridge_transfer NSString*) ABAddressBookCopyLocalizedLabel(ABMultiValueCopyLabelAtIndex (emailRef, i));

我从 ARC 收到以下警告

1. Call to function 'ABMultiValueCopyLabelAtIndex' returns a Core Foundation object with a +1 retain count
2. Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1

现在我的问题是,如何进行嵌套的 __bridge_transfer 调用?

【问题讨论】:

    标签: automatic-ref-counting abaddressbook core-foundation


    【解决方案1】:
    NSString *eType = (__bridge_transfer NSString*)
        ABAddressBookCopyLocalizedLabel(
            ABMultiValueCopyLabelAtIndex (emailRef, i) /* <-- this object is leaked */
        );
    

    此代码无效,因为您在此处泄漏了标签(我知道这是您的意思吗?)。

    您应该在 Instruments NSZombie 工具下运行该代码,它会跟踪所有保留/释放,并且您会知道发生了什么,因为坦率地说,查看代码,我不明白为什么它是错误的。

    【讨论】:

      猜你喜欢
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-13
      • 2012-08-24
      相关资源
      最近更新 更多