0

ABAddressBook 发生了一件奇怪的事情。这是一些代码:

- (NSArray*)addressBookArray {

    ABAddressBookRef addressBook = NULL;
    NSArray *temp = nil;

    if(&ABAddressBookCreateWithOptions != NULL) {

        CFErrorRef error = nil;
        addressBook = ABAddressBookCreateWithOptions(NULL, &error);
        ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) {

            dispatch_async(dispatch_get_main_queue(), ^{
                if(error) {
                    // handle error
                }
                else if(!granted) {
                    // handle not granted
                }
            });
        });
    }
    else { // iOS 5
        addressBook = ABAddressBookCreate();
    }
    if(addressBook) {
        temp = (__bridge_transfer NSArray*)ABAddressBookCopyArrayOfAllPeople(addressBook);
        CFRelease(addressBook);
    }
    return temp;
}

- (NSArray*)emailList {

    NSArray *temp = [self addressBookArray];
    NSMutableArray *list = nil;

    if(temp) {

        int n = temp.count;
        list = [NSMutableArray arrayWithCapacity:n];

        for(int i = 0; i < n ; i++) {

            ABRecordRef person = (__bridge ABRecordRef)[temp objectAtIndex:i];
            NSString *name = (__bridge_transfer NSString*)ABRecordCopyCompositeName(person);

            if(name) {
                ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);

                if(emails) {
                    int cnt = ABMultiValueGetCount(emails);

                    for(int j = 0; j < cnt; j++) {
                        NSString *email = (__bridge_transfer NSString*)ABMultiValueCopyValueAtIndex(emails, j);

                        if(email) {
                            [list addObject:email];
                            break;
                        }
                    }
                    CFRelease(emails);
                }
            }
        }
    }
    return list;
}

如果我调用emailList并注释掉CFRelease(addressBook),我会收到 XCode 分析中可能存在泄漏的警告,但我的代码运行正常。

如果我取消注释CFRelease(addressBook),则没有泄漏警告,ABRecordRef person并且NSString *name具有适当的值,但ABMultiValueRef emails如果始终为零。

使困惑。

4

1 回答 1

2

虽然这让我有些吃惊,但我怀疑ABPerson没有它的ABAddressBook. 因此,地址簿需要与人一样存在。鉴于此,只要这都是单线程的,您可能希望将您的存储ABAddressBook在 ivar 中,这样您就不必一直创建和销毁它。如果它是多线程的,请记住ABAddressBook每个线程需要一个单独的。

于 2013-01-09T17:26:57.020 回答