ABAddressBookCopyArrayOfAllPeople и ABAddressBookGetPersonCount возвращают разные размеры

У меня есть приложение, которое иногда дает сбой из-за массива, возвращенного ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering (), размер которого отличается от размера ABAddressBookGetPersonCount (). Оболочка кода показана ниже. Обычно nPeople имеет тот же размер, что и массив. Однако на iPhone одного пользователя (или, по крайней мере, по сообщениям одного пользователя) nPeople почти в два раза больше. Я могу остановить сбой, используя размер массива, а не ABAddressBookGetPersonCount (). Однако я не уверен, означает ли это, что у меня нет доступа ко всем контактам на iPhone.

Кто-нибудь сталкивался с этой проблемой раньше?Почему цифры были бы разными?

Я задавался вопросом, было ли это как-то связано с тем, что контакты хранятся в группах (я не знаю, есть ли группы - просто идея). Кроме того, с адреса электронной почты пользователя, я подозреваю, что они используют MobileMe. Я задавался вопросом, создаст ли синхронизация с MobileMe дубликаты с другим recordId, но не удалит существующий Contact, по крайней мере, не так, как ABAddressBookGetPersonCount ().

РЕДАКТИРОВАТЬ: Я рассмотрел это еще немного и довольно неплохо понять причину проблемы. Поскольку я хотел отсортированный массив контактов, я использовал ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering (). Это требует источника адресной книги - я использовал источник по умолчанию. Я считаю, что могут быть различные источники - локальный источник плюс другие, такие как Exchange и MobileMe. Поэтому мой массив будет содержать только локальные контакты, тогда как число, возвращаемое ABAddressBookGetPersonCount (), будет включать все источники - отсюда мой сбой. Поэтому я думаю, что было бы лучше просто работать с локальными данными в моем приложении и использовать размер массива, возвращаемый ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering, а не ABAddressBookGetPersonCount.

CFArrayRef allPeople = InSourceWithSortOrdering(addressBook, source, kABPersonSortByLastName);  

    CFIndex nPeople = ABAddressBookGetPersonCount(addressBook);

    for (int i = 0; i < nPeople; i++) 
    {
        ABRecordRef ref = CFArrayGetValueAtIndex(allPeople, i);
    }   

Ответы на вопрос(3)

Ваш ответ на вопрос