ABRecordCopyValue()SIGSEGV

时间:2012-01-12 09:33:48

标签: iphone calendar addressbook abrecord

我目前正在从地址簿中提取所有联系人,并希望保存我遇到特定联系人的最后日期。因此,我在同一时间获取日历:

for (EKEvent* event in events) {
            for (EKParticipant* attende in [event attendees]) {
                ABRecordRef record = [attende ABRecordWithAddressBook:addressBook];
                if([contact.name isEqualToString:[NSString stringWithFormat:@"%@ %@", (__bridge NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty), (__bridge NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty)]]){
                        contact.lastMet = [NSString stringWithFormat:@"%@",[formatter stringFromDate:event.endDate]];
                    }

            }

        }

可悲的是,代码在信号SIGSEGV的“if”-statement行崩溃,崩溃日志表明ABRecordCopyValue()发生了故障...有任何建议如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

因为您没有发布完整代码,所以我无法自行调试问题。但我认为答案是由ikuragames在评论中给出的。崩溃的最可能原因是,执行代码时可能是记录为空。调试代码并检查记录和kABPersonFirstNameProperty的值。如果我是对的那么您必须为记录分配一些初始值或根据需要更改您的代码。如果它没有解决您的问题,请发布调试信息,并进行一些深入的描述。

:)

谢谢你..

答案 1 :(得分:1)

您可以在if语句的开头简单地测试非nil的记录。如果测试失败,则不评估表达式的其余部分。所以以下内容可以治愈你的崩溃。

for (EKEvent* event in events) {
        for (EKParticipant* attende in [event attendees]) {
            ABRecordRef record = [attende ABRecordWithAddressBook:addressBook];
            if(record && [contact.name isEqualToString:[NSString stringWithFormat:@"%@ %@", (__bridge NSString *)ABRecordCopyValue(record, kABPersonFirstNameProperty), (__bridge NSString *)ABRecordCopyValue(record, kABPersonLastNameProperty)]]){
                    contact.lastMet = [NSString stringWithFormat:@"%@",[formatter stringFromDate:event.endDate]];
                }
        }
    }