2014-09-09 11 views
0

iPad의 주소록 전자 메일에 액세스하려고합니다.ABMultiValueRef에서 응용 프로그램이 충돌합니다.

코드의 일부는 다음과 같습니다

ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, NULL); 
ABRecordRef recordRef = ABAddressBookCopyDefaultSource(addressBookRef); 
CFArrayRef arrayRef = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBookRef, recordRef, kABPersonSortByFirstName); 

for(int i = 0;i<ABAddressBookGetPersonCount(addressBookRef);i++) 
{ 
     ABRecordRef ref = CFArrayGetValueAtIndex(arrayRef, i); 
     ABMultiValueRef emails = ABRecordCopyValue(ref, kABPersonEmailProperty); 
     . 
     . 
     . 
     . 

충돌은 클라이언트 아이 패드 미니에 재현. 우리는 충돌을 재현하려고했지만 그 일은 일어나지 않았습니다.

디버그 빌드를 분석 한 후 "ABMultiValueRef emails = ABRecordCopyValue (ref, kABPersonEmailProperty);"라인에서 충돌이 발생했음을 알게되었습니다. " 매번 충돌이 발생하지 않습니다. 주소록 이메일에 액세스하려고 2-3 번 시도합니다. 클라이언트 전용.

의심되는 항목은 "ABRecordRef ref = CFArrayGetValueAtIndex (arrayRef, i);"입니다. nil 또는 비어있을 수 있습니다. 그러나 어떤 경우에는 이것이 비어 있거나 비어있을 수 있습니까?

어떤 사람이 충돌 사고의 원인인지 알 수 있습니다.

+0

크래시 로그의 내용은 무엇입니까? – n00bProgrammer

+0

@ n00bProgrammer : 죄송합니다. 크래시 로그 양식 클라이언트를받을 수 없습니다. – Raju

답변

0

ABAddressBookGetPersonCount은 주소록에있는 모든 사람의 수를 반환하는 반면 ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering은 1 개의 출처 만 가진 모든 사람을 반환하기 때문에 그 수는 다를 수 있습니다. 또한 아래 오류를 확인하는 것이 좋습니다. 물론 반환 된 CF 객체는 CFRelease입니다.

CFErrorRef error = nil; 
    ABAddressBookRef addressBookRef = ABAddressBookCreateWithOptions(NULL, &error); 
    if (addressBookRef != nil) { 
     ABRecordRef recordRef = ABAddressBookCopyDefaultSource(addressBookRef); 
     CFArrayRef arrayRef = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressBookRef, recordRef, kABPersonSortByFirstName); 
     const unsigned int nrAllPeopleInSource = (unsigned int)CFArrayGetCount (arrayRef); 
     if (arrayRef != nil) { 
//   for(int i = 0;i<ABAddressBookGetPersonCount(addressBookRef);i++) 
      /* 
      ABAddressBookGetPersonCount returns the number of all people in the address book, whereas 
      ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering returns all people of only 1 source, and their number might be different. 
      */ 
      for(int i = 0;i<nrAllPeopleInSource;i++) 
      { 
       ABRecordRef ref = CFArrayGetValueAtIndex(arrayRef, i); 
       ABMultiValueRef emails = ABRecordCopyValue(ref, kABPersonEmailProperty); 
       // ... further code 
      } 
     } else { 
      // no person found 
     } 
    } else { 
     // addressbook could not be opened, lookup error 
    } 
+0

어떤 상황에서 우리가 충돌을 재현 할 수 있습니까? 우리 장치에서 그런 일이 일어나지 않았기 때문에? 또는 "ABRecordRef"를 어떻게 만들 수 있습니까? – Raju

+0

장치에서 충돌을 재현하려면 적어도 한 사람이 들어있는 주소록에 추가 소스를 추가하는 것으로 충분합니다. 일반적인 소스는 iCloud 또는 추가 CardDAV 서버입니다. 기본 소스는 iCloud라고 생각합니다. 추가 CardDAV 서버는 예를 들어, 테스트 목적으로 OSX 서버를 사용하여 생성됩니다. –

+0

답장을 보내 주셔서 감사합니다. 나는 이것을 시도하고 다시 ... – Raju

관련 문제