代码之家  ›  专栏  ›  技术社区  ›  Coocoo4Cocoa

iPhone通讯录上出现空白字段,如何调试?

  •  0
  • Coocoo4Cocoa  · 技术社区  · 16 年前

    下面的代码按名字和姓氏为我创建了一个地址簿中所有联系人的数组。问题是,我有一个联系人一直显示空的名字和姓氏。在我的实际通讯簿中找不到那个联系人。有人能建议如何调试它来找出神秘鬼联系的来源吗?

    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中,我可以做些什么来进一步检查这个特定的人对象,看看它的来源是从哪里来的?

    2 回复  |  直到 16 年前
        1
  •  1
  •   rein    16 年前

    该条目可能标记为组织记录,而不是个人记录。在这种情况下,您必须提取组织名称,而不是名字和姓氏。

    尝试查看属性:

    kABPersonOrganizationProperty, kABPersonKindProperty
    
        2
  •  1
  •   Bluephlame    16 年前

    它可能只是一个组织的联系人

    尝试查看这些属性

    这些常量实现Person类型属性(属于 类型kabintegerpropertytype),其中 指示人员记录 代表一个人或一个 组织。

         const ABPropertyID kABPersonKindProperty;
         const CFNumberRef kABPersonKindPerson;
         const CFNumberRef kABPersonKindOrganization;