Iphone ABRecordCopyValue()SIGSEGV

Iphone ABRecordCopyValue()SIGSEGV,iphone,calendar,addressbook,abrecord,Iphone,Calendar,Addressbook,Abrecord,我目前正在从地址簿中获取所有联系人,并希望保存我遇到某个特定联系人的最后日期。因此,我同时获取日历,如下所示: for (EKEvent* event in events) { for (EKParticipant* attende in [event attendees]) { ABRecordRef record = [attende ABRecordWithAddressBook:addressBook];

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

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”-语句行崩溃,崩溃日志表明故障发生在ABRECORDCYVALUE()…有没有解决此问题的建议?

您只需在if语句的开头测试记录是否为非零即可。如果测试失败,则不计算表达式的其余部分。因此,下面应该可以解决您的崩溃

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]];
                }
        }
    }

您只需在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]];
                }
        }
    }

当您收到错误时,
record
nil?
ABRecordWithAddressBook
的返回值是参与者的
地址簿记录,如果没有找到记录,则返回值为零。
如果记录为零,我猜复制操作可能会失败。
record
出现错误时是否为零?
ABRecordWithAddressBook
的返回值是参与者的
地址簿记录,如果未找到记录,则返回值为零。
如果记录为零,则复制操作可能失败。