У меня есть приложение, которое иногда сбивается из-за массива, возвращаемого AbaddressbookCopyarrayoFallpeoplensourceWithsortordoring (), имея другой размер для AbaddressbookgetPersonCount (). Оболочка кода показана ниже. Обычно NPeople - это тот же размер, что и массив. Однако на iPhone одного пользователя (или, по крайней мере, как сообщается одним пользователем), NPeople почти вдвое больше. Я могу остановить аварию, используя размер массива, а не AbaddressbookgetPersonCount (). Однако я не уверен, что это означает, что я не доступа к всем контактам в iPhone.
Я задавался вопросом, было ли это что-то связано с контактами, хранящимися в группах (я не знаю, что есть группы - просто идея). Кроме того, из адреса электронной почты пользователя я подозреваю, что они используют MobileMe. Я задавался вопросом, если синхронизация с MobileMe создаст дубликаты с другим RelectID, но не удалять существующий контакт, по крайней мере, не так далеко, как abaddressbookgetPersoncount ().
Редактировать: Я посмотрел в это еще несколько и иметь довольно хорошую идею по причине проблемы. Как я хотел отсортированный массив контактов, я использовал AbaddressBookCopyarrayoFallpeopleinsourceWithSortordoring (). Это требует адресного источника книги - я использовал источник по умолчанию. Я считаю, что могут быть различные источники - местный источник плюс другие, такие как Exchange и Mobileme. Поэтому мой массив в конечном итоге окажется только на местных контактах, в то время как номер, возвращенный AbaddressbookgetPersonCount (), будет включать все источники - отсюда, в моем краю. Поэтому, я думаю, было бы лучше просто работать с локальными данными в моем приложении и использовать размер массива, возвращаемый AbaddressbookCopyarrayoFallpeopleinsourceWithsortordoring, а не AbaddressbookgetPersonCount.
CFArrayRef allPeople = InSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName);
CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);
for (int i = 0; i < nPeople; i++)
{
ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
}