2012-11-27 2 views
2

내 앱에서 주소록에있는 전화 번호를 찾으려고 시도하는 중 Im을 (를) 찾지 못해 놀랐습니다. 그게 내 애플 리케이션에 의해 액세스 콘솔의 이상한 일부 연락처가 누락되었습니다 내 주소록의 모든 번호를 인쇄했습니다, 나는 내 주소록과 출력을 비교했다, 그것은 단지 몇 가지지만 아직도.ABAddressBookCopyArrayOfAllPeople의 연락처가 누락되었습니다.

이 메신저 주소록을 accesing 방법은 다음과 같습니다

ABAddressBookRef addressBook = ABAddressBookCreate(); 
NSArray *people = (NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook); 

BOOL found = NO; 
NSString *name; 
int i = 0; 
while (!found) {//Here I print all the contact info, name and phone number 
     ABRecordRef person = (ABRecordRef)[people objectAtIndex:i]; 
     ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty); 
     NSLog(@"el telf: %@ y nombre %@",tempPhone2, [NSString stringWithFormat:@"%@ %@",ABRecordCopyValue(person, kABPersonFirstNameProperty) ? (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty) : @"",ABRecordCopyValue(person, kABPersonLastNameProperty) ? (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty) : @""]);       
     if([[key objectForKey:@"phone"] isEqualToString:tempPhone2]){ 
      found = YES;   
     } 
} 

임 내 주소록에있는 모든 연락처를 accesing하지 왜 어떤 생각?

[편집] 이상한 점은 내가 ABPeoplePickerNavigationController을 사용할 때 누락 된 연락처가 나타나는 것입니다.

답변

2

아래를 시도하십시오.

ABAddressBookRef lAddressBook = ABAddressBookCreate(); 
CFArrayRef lRawAddressBookEntries = 
ABAddressBookCopyArrayOfAllPeople(lAddressBook); 
CFIndex lTotalContactsCount = ABAddressBookGetPersonCount(lAddressBook); 
for (CFIndex i = 0; i < lTotalContactsCount; i++) { 
    ABRecordRef lRef = CFArrayGetValueAtIndex(lRawAddressBookEntries, i); 

    ABMultiValueRef phoneNumberProperty = ABRecordCopyValue(lRef, kABPersonPhoneProperty); 
    NSArray* phoneNumbers1 = (NSArray*)ABMultiValueCopyArrayOfAllValues(phoneNumberProperty); 
    CFRelease(phoneNumberProperty); 

    // Do whatever you want with the phone numbers 
    if(phoneNumbers1 && [phoneNumbers1 isKindOfClass:[NSArray class]]) { 
     for(NSString *stringPhoneNUmber in phoneNumbers1) { 
      if([stringPhoneNUmber isEqualToString:tempPhone2]){ 
       found = YES; 
      } 
     } 
    } 
} 
+0

OP의 원래 코드에서 무엇이 잘못되었는지 설명 할 수 있습니까? :) –

+0

나는 그가 거기에서 놓친 것을 모른다. 그러나 그것은 단지 작동 코드 다. 나는 나의 프로젝트에서 사용하고있다. –

+0

만약'ABAddressBookCopyArrayOfAllPeople'과'ABMultiValueCopyArrayOfAllValues'를 사용한다면'CFRelease' 그들 (그리고'lAddressBook'도 마찬가지입니다)을 확인하십시오. 아니면'CFBridgingRelease'를 사용하여'CFArrayRef'에서'NSArray'까지의 수신자 부담 브리징을 즐길 수 있습니다. 그러면 ARC가 메모리 관리를 담당 할 것입니다. 그러나이 코드는 모든 연락처와 모든 전화 번호를 유출합니다. 정적 분석기를 사용하면 여기에서 모든 누설을 식별하는 데 도움이됩니다. – Rob