kABPersonFirstNameProperty ... Trowing EXC_BAD_ACCESS - PullRequest
0 голосов
/ 15 февраля 2010

Я читаю контакты адресной книги ... все идет хорошо, пока я не проверю контакт с нет Имя (Так как я могу создать контакт только с помощью электронной почты, телефона или другого пользователя). Код (сокращенный) такой:

- (NSMutableArray *) getContactsInfo {
    NSMutableArray *contactsList = [[NSMutableArray alloc] init];
    localAddressBook = ABAddressBookCreate();

    int contactsLength = (int)ABAddressBookGetPersonCount(localAddressBook);

    if (contactsLength < 1)
        return nil;

    for(int currentContact=1; currentContact < (contactsLength + 1); currentContact++) {
        ABRecordRef person = ABAddressBookGetPersonWithRecordID(localAddressBook,(ABRecordID) currentContact);

        firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
        NSLog(@"%@", firstName);

        [contactsList addObject:firstName];
        CFRelease(person);
    }

    return contactsList;
}

и вывод, который я получаю, таков:

2010-02-15 14:16:25.616 testApp[7065:207] Contact0
2010-02-15 14:16:25.618 testApp[7065:207] Contact1
2010-02-15 14:16:25.619 testApp[7065:207] Contact2
Program received signal:  “EXC_BAD_ACCESS”.

У меня 3 контакта с именами и фамилиями И один, созданный только с фамилией, для целей тестирования.

Кажется, я могу правильно прочитать любое свойство, такое как электронная почта или адрес, с массивами ... но когда контакту не хватает свойства имени, приложение вылетает.

Ответы [ 4 ]

4 голосов
/ 16 февраля 2010

Вы делаете что-то очень неправильное в своем коде: вы предполагаете, что идентификаторы записей последовательны и начинаются с 1. Это совсем не так, вы не можете полагаться на это.

Вместо этого вы должны использовать ABAddressBookCopyArrayOfAllPeople, чтобы найти все записи в адресной книге, а затем использовать основные функции CFArray, чтобы добраться до отдельных элементов.

(Да, API адресной книги в iPhone ужасен)

1 голос
/ 15 февраля 2010

Вы можете включить NSZombies , чтобы точно определить, откуда исходит EXEC_BAD_ACCESS.

0 голосов
/ 16 февраля 2010

Проблема действительно в нулевом имени, но не в операторе log, а в том, где вы пытаетесь вставить nil в массив. Вы не можете вставить значение nil в массив, что вызывает сбой. NSLog еще не сбросил вывод в консоль, поэтому вы еще не видите свой последний оператор журнала, в котором говорится, что имя nil.

Каждый раз, когда вы получаете данные из адресной книги, убедитесь, что значение равно нулю, прежде чем вставить их во что-либо.

0 голосов
/ 15 февраля 2010

Чтобы убедиться, что сбой происходит в пределах ABRecordCopyValue, а не при попытке использовать firstName в первый раз (который может быть НЕДЕЙСТВИТЕЛЕН?) Кроме того, person не NULL либо, правильно? (В целом, больше кода в вопросе вместе с подробностями о том, какая строка вызывает сбой, было бы полезно.)

Еще одна вещь, которую стоит попробовать, - привести person к ABRecord* и использовать [valueForProperty][1]; эти два типа являются бесплатными мостовыми соединениями, и вы можете получить другой результат из последнего (хотя я сомневаюсь в этом).

Обновление : учитывая опубликованный вами код, вам нужно проверить, что firstName не равен NULL, прежде чем пытаться вывести его через NSLog - очень возможно, ABRecordCopyValue просто возвращает NULL ( подтверждая тот факт, что для этой записи отсутствуют данные об именах.) Вам также следует проверить правильность самого значения person ref - передача NULL лично в ABRecordCopyValue может стать источником дополнительных проблем.

...