0

주소록 연락처를 읽는 중 ... 이름으로 연락처를 테스트 할 때까지 모든 것이 잘됩니다. 전자 메일이나 전화 또는 wathever로 연락처를 만들 수 있기 때문에 ...). 코드 (감소)이 이것이다 :kABPersonFirstNameProperty ... trowing EXC_BAD_ACCESS

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

내가 얻을 출력은 이것이다 : 나는 이름과 성 그리고 단지 마지막 이름으로 생성 한 3 연락처가

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”. 

, 테스트 목적으로.

전자 메일이나 주소 배열과 같은 속성을 제대로 읽을 수있는 것 같습니다. 연락처에 First Name 속성이 없으면 응용 프로그램이 충돌합니다. 처음 firstName를 사용하려고하면 확인

+1

콘솔에서 무엇을 말 했나요? – kennytm

답변

0

, 충돌이ABRecordCopyValue 아니라 내에서 발생 를 취하고있다 (NULL이 될 수있다?) 또한, person 올바른 어느 NULL이? (일반적으로 더 많은 코드가 충돌하는 부분에 대한 세부 정보와 함께 도움이 될 것입니다.)

또 다른 시도는 personABRecord*으로 캐스팅하고 [valueForProperty][1]을 사용하는 것입니다. 두 가지 유형은 수신자 부담으로 연결되어 있으며 후자에서 다른 결과를 얻을 수 있습니다 (그러나 나는 의심 스럽지만).

업데이트 : 당신은 당신이 firstName 확인 할 필요가 게시 한 코드를 감안할 NSLog를 통해 출력 그것을 시도하기 전에 NULL이 - 그것은 ABRecordCopyValue 단순히 사실을 나타내는 (NULL을 반환 가능성이 높다 더 이름 데이터가 없습니다 해당 레코드의 현재 값입니다.) person 참조 값 자체의 유효성을 확인해야합니다. NULL을 직접 사람에게 전달하면 ABRecordCopyValue이 추가 문제의 원인이 될 수 있습니다.

+0

나는이 게시판을 처음 사용하고 있으며 게시하려고 시도한 코드는 추한 것처럼 보입니다. PasteBin에서이 링크를 한번 보시기 바랍니다.com [코드 게시 방법을 배우기 전까지]/ http://pastebin.com/ma738189 – Octavio

0

문제는 실제로 nil이라는 이름입니다. 로그 문에는 문제가 없지만 배열에 nil을 삽입하려고하면 오류가 발생합니다. 배열에 nil 값을 삽입 할 수 없으므로 충돌이 발생합니다. NSLog는 아직 출력을 콘솔로 플러시하지 않았기 때문에 이름이 nil이라는 최종 로그 문을 아직 보지 못했습니다.

주소록에서 데이터를 가져올 때마다 값을 입력하기 전에 값이 nil인지 확인하십시오.

4

코드에서 매우 잘못된 것을 수행하고 있습니다. 레코드 ID가 순차적이며 1에서 시작한다고 가정합니다.이 경우에는 해당되지 않습니다.

주소록에있는 모든 레코드를 찾은 다음 Core Foundation CFArray 함수를 사용하여 개별 항목을 가져 오려면 ABAddressBookCopyArrayOfAllPeople을 사용해야합니다.

(예, iPhone의 주소록 API는 끔찍합니다.)

+0

예! 이것은 나를 위해 일한 해답이었습니다. 배열의 배열을 걷고 인덱스로 요청하는 코드를 사용하고있었습니다. 큰 실수. CFArray를 NSArray로 캐스팅 한 다음이를 반복하면 어떤 문제가 해결되었는지 알 수 있습니다. – Wyllys

+0

코드를 업데이트 할 수 있습니까? 도움이 될만한 :) – user1147981