首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用程序在ABMultiValueRef上崩溃

应用程序在ABMultiValueRef上崩溃
EN

Stack Overflow用户
提问于 2014-09-09 04:54:52
回答 1查看 249关注 0票数 0

我正在尝试访问iPad的地址簿电子邮件。

守则的部分是:

代码语言:javascript
复制
ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL);
ABRecordRef recordRef = ABAddressBookCopyDefaultSource(addressBookRef);
CFArrayRef arrayRef  = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBookRef, recordRef, kABPersonSortByFirstName);

for(int i = 0;i<ABAddressBookGetPersonCount(addressBookRef);i++)
{
      ABRecordRef ref = CFArrayGetValueAtIndex(arrayRef, i);
      ABMultiValueRef emails = ABRecordCopyValue(ref, kABPersonEmailProperty);
      .
      .
      .
      .

这起事故只能在客户端iPad上才能重现。我们试图复制崩溃,但它没有发生。

在分析了调试构建之后,我们了解到在"ABMultiValueRef emails = ABRecordCopyValue(ref,kABPersonEmailProperty)“行中发生了崩溃。坠机并不是每次都会发生。它在2-3次尝试访问addressBook电子邮件时发生一次.只为客户。

我怀疑"ABRecordRef ref = CFArrayGetValueAtIndex(arrayRef,i)“可能为零,也可能为空。但在何种情况下,这可能是零或空?

谁能帮我知道坠机的原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-09 05:45:14

原因可能是ABAddressBookGetPersonCount返回地址簿中所有人员的数量,而ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering只返回一个源的所有人员,并且他们的人数可能不同。另外,我建议您检查下面这样的错误。当然,您还必须对任何返回的CF对象进行CFRelease

代码语言:javascript
复制
    CFErrorRef error = nil;
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, &error);
    if (addressBookRef != nil) {
        ABRecordRef recordRef = ABAddressBookCopyDefaultSource(addressBookRef);
        CFArrayRef arrayRef  = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBookRef, recordRef, kABPersonSortByFirstName);
        const unsigned int nrAllPeopleInSource = (unsigned int)CFArrayGetCount (arrayRef);
        if (arrayRef != nil) {
//            for(int i = 0;i<ABAddressBookGetPersonCount(addressBookRef);i++)
            /*
             ABAddressBookGetPersonCount returns the number of all people in the address book, whereas
             ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering returns all people of only 1 source, and their number might be different.
             */
            for(int i = 0;i<nrAllPeopleInSource;i++)
            {
                ABRecordRef ref = CFArrayGetValueAtIndex(arrayRef, i);
                ABMultiValueRef emails = ABRecordCopyValue(ref, kABPersonEmailProperty);
                // ... further code
            }
        } else {
            // no person found
        }
    } else {
        // addressbook could not be opened, lookup error
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25736937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档