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 の Analyze でリークの可能性があるという警告が表示されますが、コードは正しく動作します。

コメントを外すCFRelease(addressBook)と、リークの警告はなく、適切な値がありますが、ABRecordRef person常にnil の場合です。NSString *nameABMultiValueRef emails

混乱している。

4

1 に答える 1

2

少々驚きましたが、ABPersonは がなければ完全には定義されないのではないかと思いABAddressBookます。そのため、アドレス帳はその人が存在する限り存在する必要があります。ABAddressBookこれがすべてシングルスレッドである限り、常に作成して破棄する必要がないように、ivarに格納することをお勧めします。マルチスレッドの場合は、スレッドごとに個別に必要になることに注意してくださいABAddressBook

于 2013-01-09T17:26:57.020 に答える