ABAddressBookGetPersonCount

ABAddressBookGetPersonCount

我有一个应用偶尔崩溃,原因是ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering()返回的数组的大小与ABAddressBookGetPersonCount()的大小不同。该代码的 shell 如下所示。通常,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);
        }
    

    最佳答案

    ABAddressBookGetPersonCountABAddressBookCopyArrayOfAllPeople给出了不同的数组。

    ABAddressBookGetPersonCount-返回地址簿中的人员记录数。
    ABAddressBookCopyArrayOfAllPeople-返回地址簿中的所有人员记录。

    因此,有时同一个人可能会有额外的记录。这就是为什么您可能会得到不同的尺寸。

    10-07 23:48