Iphone KabbersonfirstNameProperty。。。trowing EXC\u坏通道

Iphone KabbersonfirstNameProperty。。。trowing EXC\u坏通道,iphone,objective-c,memory-management,exc-bad-access,abaddressbook,Iphone,Objective C,Memory Management,Exc Bad Access,Abaddressbook,我正在看通讯录联系人。。。一切都很顺利,直到我测试了与no的接触 名字(因为我只需要一封电子邮件、一个电话或一个电话就可以创建一个联系人……)。 代码(简化)如下所示: 我有3个联系人的名字和姓氏 为了测试的目的,只使用姓氏创建了一个 似乎我可以正确地阅读任何属性,如电子邮件或带有数组的地址。。。但是,当联系人没有名字属性时,应用程序会崩溃。为了确保崩溃发生在ABRecordCopyValue中,而不是在您第一次尝试使用firstName时(可能为空?),而且,person也不是空的,对吗?(一

我正在看通讯录联系人。。。一切都很顺利,直到我测试了与no的接触 名字(因为我只需要一封电子邮件、一个电话或一个电话就可以创建一个联系人……)。 代码(简化)如下所示:

我有3个联系人的名字和姓氏 为了测试的目的,只使用姓氏创建了一个


似乎我可以正确地阅读任何属性,如电子邮件或带有数组的地址。。。但是,当联系人没有名字属性时,应用程序会崩溃。

为了确保崩溃发生在
ABRecordCopyValue
中,而不是在您第一次尝试使用
firstName
时(可能为空?),而且,
person
也不是空的,对吗?(一般来说,问题中的更多代码以及关于哪一行崩溃的详细信息会有所帮助。)

另一种尝试是将
person
转换为
ABRecord*
并使用
[valueForProperty][1]
;这两种类型是免费桥接的,您可能会从后者中得到不同的结果(尽管我对此表示怀疑)


更新:给定您发布的代码,在尝试通过
NSLog
输出之前,您需要检查
firstName
是否为空-很可能
ABRecordCopyValue
只是返回空值(表示该记录没有名字数据)您还应该检查
person
ref值本身的有效性-亲自将NULL传递给
ABRecordCopyValue
可能是其他问题的根源。

为了确保崩溃发生在
ABRecordCopyValue
中,而不是在您首次尝试使用
firstName
时(哪一个可能是空的?)另外,
person
也不是空的,对吗?(一般来说,问题中的更多代码以及关于哪一行崩溃的详细信息会有所帮助。)

另一种尝试是将
person
转换为
ABRecord*
并使用
[valueForProperty][1]
;这两种类型是免费桥接的,您可能会从后者中得到不同的结果(尽管我对此表示怀疑)


更新:给定您发布的代码,在尝试通过
NSLog
输出之前,您需要检查
firstName
是否为空-很可能
ABRecordCopyValue
只是返回空值(表示该记录没有名字数据)您还应该检查
person
ref值本身的有效性-亲自将NULL传递给
ABRecordCopyValue
可能是其他问题的根源。

您可能希望查看EXEC\u BAD\u访问的确切来源。

您可能希望查看EXEC\u BAD\u访问的确切来源。

问题确实是名为nil,但不是在log语句中,而是在尝试将nil插入数组的地方。无法将nil值插入数组中,这会导致崩溃。NSLog尚未将输出刷新到控制台,这就是为什么您还没有看到最后一条log语句说名为nil


无论何时从通讯簿中获取数据,在将其插入任何内容之前,请检查该值是否为nil。

问题确实是nil的名字-但不是在log语句中,而是在尝试将nil插入数组的位置。无法将nil值插入数组中,这会导致崩溃。NSLog尚未刷新到e控制台,这就是为什么您还没有看到最后一条日志语句说firstname是nil


任何时候从通讯簿中获取数据时,请先检查该值是否为零,然后再将其插入任何内容中。

您在代码中做了一些非常错误的事情:您假设记录ID是连续的,从1开始。这根本不是事实,您不能依赖于此

你应该做的是使用“代码> ababraseBooCoprayAffys<代码>查找地址簿中的所有记录,然后使用核心基础<代码> CFArray < /Cuff>函数获取各个项目。


(是的,iPhone中的通讯录API非常糟糕)

您的代码中有一些非常错误的地方:您假设记录ID是顺序的,从1开始。事实并非如此,您不能依赖于此

你应该做的是使用“代码> ababraseBooCoprayAffys<代码>查找地址簿中的所有记录,然后使用核心基础<代码> CFArray < /Cuff>函数获取各个项目。


(是的,iPhone中的通讯录API非常糟糕)

我是新加入这个板块的人,我尝试发布的代码看起来很难看。请从PasteBin.com查看此链接[直到我学会如何发布代码=/]我是新加入这个板块的人,我尝试发布的代码看起来很难看。请从PasteBin.com查看此链接[直到我学会如何发布代码=/]是的!这是对我有效的答案。我使用的代码遍历记录数组并按索引请求它们。这是一个大错误。将CFArray强制转换为NSArray,然后仅对其进行迭代,这是我修复它的原因。你能更新你的代码吗?会很有帮助:)是的!这是对我有效的答案。我使用的代码是遍历记录数组并按索引请求它们。这是一个大错误。将CFArray转换为NSArray,然后对其进行迭代,这是我修复它的原因。你能更新你的代码吗?会很有帮助:)
- (NSMutableArray *) getContactsInfo {
    NSMutableArray *contactsList = [[NSMutableArray alloc] init];
    localAddressBook = ABAddressBookCreate();

    int contactsLength = (int)ABAddressBookGetPersonCount(localAddressBook);

    if (contactsLength < 1)
        return nil;

    for(int currentContact=1; currentContact < (contactsLength + 1); currentContact++) {
        ABRecordRef person = ABAddressBookGetPersonWithRecordID(localAddressBook,(ABRecordID) currentContact);

        firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
        NSLog(@"%@", firstName);

        [contactsList addObject:firstName];
        CFRelease(person);
    }

    return contactsList;
}
2010-02-15 14:16:25.616 testApp[7065:207] Contact0
2010-02-15 14:16:25.618 testApp[7065:207] Contact1
2010-02-15 14:16:25.619 testApp[7065:207] Contact2
Program received signal:  “EXC_BAD_ACCESS”.