Что может вернуть ABRecordCopyValue? (решение плохого доступа)

Я использую этот простой код, чтобы получить все контакты из адресной книги в ios 7. У меня 155 контактов в моем адресе. Когда я регистрирую людей первым Именами, я получаю 34 правильных имени, выбранных (очевидно, случайно) из моей адресной книги, 15 имен пустыми, а затем по пункту 50 происходит сбой плохого доступа на линии

   NSString *firstNames = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty)

Я пробовал фамилию логина или изображение не менялось. Я пытался избежать выполнения ABRecordCopyValue для нулевого объекта, не получая изменений. Я пытался выполнить ABRecordCopyValue для элемента>50 и получил тот же результат для элементов от 50 до 150. Что я делаю не так? Что ABRecordCopyValue может возвращать рядом с правильными значениями и нулем?

+(NSArray *)getAllContactsAddress
{
CFErrorRef *error = nil;
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);

// SUPPOSE access has been granted
BOOL accessGranted = true;

if (accessGranted) {
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, error);
    ABRecordRef source = ABAddressBookCopyDefaultSource(addressBook);
    CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBook, source, kABPersonSortByFirstName);
    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
    NSMutableArray* items = [NSMutableArray arrayWithCapacity:nPeople];


    for (int i = 0; i < nPeople; i++)
    {
        ContactsData *contacts = [ContactsData new];

        ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);

        NSString *firstNames = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty);

        NSLog(@"%@",firstNames);
    }
}

1 ответ

Решение

Я думаю (я на самом деле довольно уверен), проблема в том, что nPeople неверное значение и не соответствует количеству записей в allPeople массив, как вы предполагаете, что это делает. Вы использовали странный метод получения nPeople когда CFArray уже предоставляет прямой метод.

Я считаю, что это будет работать:

CFIndex nPeople = CFArrayGetCount(allPeople);

Также вам нужно проверить, если person не являетсяNULL перед его использованием:

ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
NSAssert(person, @"Non-person detected!");
Другие вопросы по тегам