Что может вернуть 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!");