2011-11-16 3 views
0

저는 객관적인 C를 처음 접했고 저는 앱을 급히 만들어야하는 위치에 있습니다. 나는 앱 나는 QR 코드를 감지하고있는 NSString 형식으로 vCard를 얻는 것의 일부에 엑스 코드 4.2VCard 리더가 작동하지 않습니다.

을 사용하고 있습니다 : 다음 코드를 사용하여 함수를했다 : - 난 프레임 워크에 다음과 같은 수입 :

.H 파일에
AddressBookUI.framework 
AddressBook.framework 

내가 쓴 :

#import <addressBook/AddressBook.h> 
#import <AddressBookUI/AddressBookUI.h> 

@interface HellowWorld : UIViewController<ABPeoplePickerNavigationControllerDelegate>{ 

} 

-(IBAction)saveContacts; 
@end 

을 내가 쓴하는 .m 파일 :

-(IBAction)saveContacts{ 
    NSString *vCardString = test //where the data will be comming from 
    CFDataRef vCardData = (CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding]; ABAddressBookRef book = ABAddressBookCreate(); 
    ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(book); 
    CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData); 
    for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) {  
     ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index);  
     ABAddressBookAddRecord(book, person, NULL);  
     CFRelease(person); 
    } 
    CFRelease(vCardPeople); 
    CFRelease(defaultSource); 
    ABAddressBookSave(book, NULL); 
    CFRelease(book); 
} 

이 코드를 사용했지만 작동하지 않습니다.

CFDataRef vCardData = (CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding]; 

나는이로 변경했다 :

첫째는이 라인 컴파일되지 않았다

CFDataRef vCardData = (__bridge CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding]; 

을하고 컴파일 한 후에는이 라인에 충돌 :

for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) { 

다음과 같은 녹색 오류가 나타납니다 : Thread1: Program Received Signal "EXC_BAD_ACCESS". 이유가 있습니까?

또한 주소록에 VCard (NSString 형식)를 저장하는 유일한 방법입니까? 다른 제안?

+3

"나는'목적 C'에 새로운 오전과 내가 :

#include AddressBook/ABAddressBook.h> #include AddressBook/ABRecord.h> #include AddressBook/ABSource.h> 

그리고이 함수를 호출 :

AddressbookUi.framework

Addressbook.framework

이 헤더를 포함 추가 '내가 갑자기 앱을 만들어야한다.'라고 말한 위치에서 : Ohhhh, my god .... Ohhh, my go d .... – Oliver

답변

1

ARC를 사용하고 있다고 가정합니다.

vCardData 개체를 사용하는 동안 충돌을 중지하면 CFRetain이 발생합니까? 데이터 객체는 범위 끝까지 유지됩니다.

가능

또는 더 나은, __bridge_retained

는 다음을 수행 아이폰 연락처 목록에 release notes on ARC

+0

__bridge_retained를 시도했지만 여전히 작동하지 않습니다. 질문에 대한 답변을 잘 모르겠습니다. for 루프에서 충돌합니다. – user1044771

+0

@ user1044771 : 'vCardPeople'이 null이 아니며 정렬? – JeremyP

+0

나는 (기본적으로 나는 텍스트를 inialized) 을 확인했다. 그리고 지금 그것은 크래쉬하지 않는다. 그러나 그것은 주소록에 어떤 단서도 저장하지 않는다? – user1044771

1

가져 오기 vCard 데이터를 참조하십시오.

-(void)importVcard { 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *startPath = [paths objectAtIndex:0]; 
    NSString *filename = @"contacts.vcf"; 
    NSString *filePath = [NSString stringWithFormat:@"%@/%@",startPath,filename]; 
    NSLog(@"File Path is %@",startPath); 

    NSString *vCardString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil ]; 

    CFDataRef vCardData = (CFDataRef)[vCardString dataUsingEncoding:NSUTF8StringEncoding]; ABAddressBookRef book = ABAddressBookCreate(); 
    ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(book); 

    CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData); 

    for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) {  
     ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index);  
     ABAddressBookAddRecord(book, person, NULL);  
     CFRelease(person); 
    } 

    CFRelease(vCardPeople); 
    CFRelease(defaultSource); 
    ABAddressBookSave(book, NULL); 
    CFRelease(book); 
} 
+0

당신은 신속한 버전을 얻었습니까? – user998405