2012-01-12 5 views
1

현재 주소록에서 모든 연락처를 가져오고 특정 연락처를 만난 마지막 날짜를 저장하려고합니다. 다음과 같이 그러므로 나는 동시에 달력을 가져 오는 해요 :ABRecordCopyValue() SIGSEGV

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와 함께 "만약"-statement 줄에서, 충돌 로그는 실패() ABRecordCopyValue 발생을 나타냅니다. .. 어떤 제안이 문제를 해결하는 방법?

+2

오류가 발생하면'record'는 nil입니까? 'ABRecordWithAddressBook'의 반환 값은'참가자의 주소록 레코드이거나 레코드가 발견되지 않으면 nil입니다 .' 레코드가 nil이면 복사 작업이 실패 할 수 있습니다. – ikuramedia

답변

5

전체 코드를 게시하지 않았기 때문에 직접 문제를 디버깅 할 수 없습니다. 하지만 그 대답은 코멘트에서 ikuragames에 의해 주어진 것 같아요. 충돌의 가장 큰 원인은, 코드가 실행될 때 레코드가 null일지도 모르는 것입니다. 코드를 디버깅하고 레코드 및 kABPersonFirstNameProperty의 값을 확인하십시오. 필요에 따라 레코드의 초기 값을 지정하거나 코드를 변경해야합니다. 문제가 해결되지 않으면 디버깅 정보를 약간의 설명과 함께 게시하십시오.

:

당신은 단순히 경우 문장의 시작 부분에 nil이 아닌되는 기록을 테스트 할 수 있습니다

1

.. 유 감사합니다. 테스트가 실패하면 나머지 표현식은 평가되지 않습니다. 따라서 다음과 같이 충돌을 치료해야합니다.

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