无法读取kABPersonPhoneProperty

Man*_*lio 3 cocoa objective-c abaddressbook ios

我正面临一个(奇怪的)问题:我想检索一个联系人的电话号码,但由于某种原因,我无法这样做.

我用了

ABAddressBookRef addressBook = ABAddressBookCreate();
NSArray *contacts = (NSArray*) ABAddressBookCopyArrayOfAllPeople(addressBook);
CFRelease(addressBook);
Run Code Online (Sandbox Code Playgroud)

获取所有联系人的数组.然后我想用

ABMultiValueRef ref = ABRecordCopyValue([contacts objectAtIndex:i], kABPersonPhoneProperty);

NSLog(@"%d",ref==NULL);
Run Code Online (Sandbox Code Playgroud)

ABRecordCopyValue总是返回nil...
请注意,我能够检索有关联系人的其他信息:例如,提取名称可以正常使用

CFStringRef name = ABRecordCopyCompositeName([contacts objectAtIndex:i]);
Run Code Online (Sandbox Code Playgroud)


愿有人向我解释我做错了什么吗?我正在使用Snow Leopard和Xcode 4.2,我正在为iOS 4.0开发......

编辑:我找到了一个解决方案:而不是使用

ABRecordCopyValue([contacts objectAtIndex:i], kABPersonPhoneProperty);
Run Code Online (Sandbox Code Playgroud)

我用了

ABRecordID idRec = ABRecordGetRecordID([contacts objectAtIndex:i]);
ABMultiValueRef ref = ABRecordCopyValue(ABAddressBookGetPersonWithRecordID(addressBook, idRec), kABPersonPhoneProperty);
Run Code Online (Sandbox Code Playgroud)

但是我必须保持对addressBook(不要释放它)的引用有效,因此EricS建议的解决方案似乎更好.

Eri*_*icS 17

这只是猜测,但我会尝试保持通讯录处于打开状态,直到您完成阅读.也就是说,CFRelease(addressBook);在阅读完所有电话号码之前不要打电话.

地址簿更像是数据库而不是平面文件,并且在联系人记录中读取可以引用其他字段和数据,而不是所有实际字段内容.