【发布时间】:2009-05-25 04:43:51
【问题描述】:
以下代码按名字和姓氏在我的通讯录中为我创建了一个包含所有联系人的数组。问题是,我有一个联系人一直以空的名字和姓氏出现。我在我的实际通讯录中找不到那个联系人。谁能建议如何调试它以找出神秘幽灵联系人的来源?
ABAddressBookRef addressBook = ABAddressBookCreate();
NSArray *peopleArray = (NSMutableArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
NSMutableArray *allNames = [NSMutableArray array];
for (id person in peopleArray) {
NSMutableString *firstName = [(NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) autorelease];
NSMutableString *lastName = [(NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty) autorelease];
ABMutableMultiValueRef multiValueEmail = ABRecordCopyValue(person, kABPersonEmailProperty);
if (ABMultiValueGetCount(multiValueEmail) > 0) {
NSString *email = [(NSString *)ABMultiValueCopyValueAtIndex(multiValueEmail, 0) autorelease];
}
if (![firstName length]) {
firstName = @"";
}
if (![lastName length]) lastName = @"";
[allNames addObject:[NSString stringWithFormat:@"%@ %@", firstName, lastName]];
}
人员类型是 NSCFType 类型。我可以轻松地执行以下操作:
if (![lastName length] && ![firstName length]) continue;
.. 解决问题。我很好奇我的地址簿中的哪些条目会像幽灵一样出现。我尝试使用 gdb 内省对象,但无法从中获得任何有价值的东西。
我想查看 person 的所有属性,但将对象取消引用到 (ABPerson*) 似乎没有这样做。
我也尝试过使用 CFShow(person) 来显示它是 CPRecord 类型。但是,找不到关于此的更多文档。
我可以在 gdb 中做些什么来进一步检查这个特定的人对象以查看它的来源吗?
【问题讨论】:
-
这些属性中是否有声明为返回可变对象?我不明白你为什么在那里使用可变对象类的名称。另外,您确定 firstName 和 lastName 为空而不是 nil 吗?您在循环结束时将 nil 替换为 empty;你在替换之前还是之后检查了变量?
-
嗨,彼得,如果它们为零,我将它们替换为空,否则我的输出中会出现类似 Joe (null) 的内容。如果有更好的方法,我很想听听。这就是为什么我将它们声明为可变对象。如果有更好的方法来写这个,我很想学习。
标签: iphone objective-c cocoa cocoa-touch gdb