ABRecordCopyValue 可以返回啥? (解决错误的访问)
Posted
技术标签:
【中文标题】ABRecordCopyValue 可以返回啥? (解决错误的访问)【英文标题】:What ABRecordCopyValue can return? (solving a bad access)ABRecordCopyValue 可以返回什么? (解决错误的访问) 【发布时间】:2014-07-09 10:51:30 【问题描述】:我正在使用这个简单的代码来获取 ios 7 中地址簿的所有联系人。我的地址中有 155 个联系人。当我记录人们的名字时,我从我的地址簿中获得了 34 个正确的名字(显然是随机的),15 个名字为空,然后在第 50 项上出现错误的访问崩溃在线
NSString *firstNames = (__bridge NSString*)ABRecordCopyValue(person, kABPersonFirstNameProperty)
我尝试登录姓氏,或者图像没有变化。我试图避免对空对象执行 ABRecordCopyValue 没有任何更改。我试图在项目 >50 上执行 ABRecordCopyValue 并在从 50 到 150 的项目上得到相同的结果。我做错了什么? ABRecordCopyValue 除了正确的值和 null 之外还能返回什么?
+(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 那么它在哪里崩溃了?你能提供一个堆栈跟踪吗? 我不知道如何发布堆栈跟踪,抱歉 ^^ 但正如我在问题文本中所说,当对人员编号 (i) 50 执行 ABRecordCopyValue(person, kABPersonFirstNameProperty) 时,它会崩溃(完全没有明显的原因) 当它崩溃时,person == NULL
?
试过了,好吧,我真的很困惑。当它起作用时(前 34 项),人是“CPRecord:0x17db5b10 ABPerson>”(数字变化)。然后对于 15 项为空(仍在工作但名称为空),然后在第 50 项变为“__NSCFType”并崩溃。
【参考方案1】:
我认为 (我其实很确定)问题是nPeople
是错误的值,并且与@ 中的条目数不匹配987654322@ 数组,就像你假设的那样。当CFArray
已经提供了一种直接的方法时,您使用了一种奇怪的方法来获取nPeople
。
我认为这会起作用:
CFIndex nPeople = CFArrayGetCount(allPeople);
还需要在使用前检查person
是否为非NULL
:
ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);
NSAssert(person, @"Non-person detected!");
【讨论】:
是的,这是正确的(谢谢,它正在工作),但我仍然有一个问题:为什么我只得到 34 个联系人而不是 155 个?所以问题出在 ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering 并没有得到真正的 allPeople 吗? @ElisabettaFalivene 这可能是因为您要求通讯录返回按名字排序的条目?也许使用另一种方法?另外,如果我提供了一些帮助,请点赞如何? 对我来说仍然没有任何意义,但使用 ABAddressBookCopyArrayOfAllPeople 而不是 ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering 解决了问题。在第二种情况下,函数返回通讯簿中项目的子集,而不是全部。感谢您的帮助! 地址簿是来自多个来源(如 Facebook、iCloud 等)的记录的汇编。默认来源是输入到联系人中的地址,而不是从其他来源(如交换服务器)同步的地址。因此,如果您有 155 个联系人,但其中 121 个是从 Exchange 服务器同步的,那么如果您从默认来源检索联系人,那么您只会收到 34 个联系人。如果您希望每个联系人无论其来源如何,ABAddressBookCopyArrayOfAllPeople
是正确的方法。以上是关于ABRecordCopyValue 可以返回啥? (解决错误的访问)的主要内容,如果未能解决你的问题,请参考以下文章
CertGetCertificateChain 啥时候可以返回多个简单的证书链?
Sql Server - 有啥方法可以找到哪些存储过程返回集合,哪些不返回?
java方法通过啥关键字返回结果,如果方法没有返回值,则使用啥关键字作为?