2013-03-29 7 views
0

Я извлекаю данные vcard из файла vcf из каталога документов приложения в строку. Строка в порядке, но ABPersonCreatePeopleInSourceWithVCardRepresentation вызывает ошибку BAD_ACCESS. Heres код ...EXC_BAD_ACESS при импорте файла vcf vcard

ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(addressBook); 
NSData *data=[vcardString dataUsingEncoding:NSUTF8StringEncoding]; 
CFDataRef vCardData = (__bridge CFDataRef)data; 
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 
       if(granted) 
       { 
        NSLog(@"%@",vcardString); 
        CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData);//BAD_ACCESS ERROR 
        for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) { 
         ABRecordRef person = CFArrayGetValueAtIndex(vCardPeople, index); 
         ABAddressBookAddRecord(addressBook, person, NULL); 
         NSLog(@"added"); 
        } 

        CFRelease(vCardPeople); 
        CFRelease(defaultSource); 
        ABAddressBookSave(addressBook, NULL); 
       } 
       else 
        NSLog(@"not granted"); 

Херес NSLog vcardString ...

BEGIN:VCARD 

VERSION:3.0 

PRODID:-//Apple Inc.//iOS 6.1//EN 

N:;Home;;; 

FN:Home 

EMAIL;type=INTERNET;type=HOME;type=pref:[email protected] 

TEL;type=CELL;type=VOICE;type=pref:2323454645 

PHOTO;ENCODING=b;TYPE=JPEG:/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAICAgICAQICAgIC 

....LOT OF GIBBERISH.... 

END:VCARD 
+0

Как вы делаете vCardData ?? – borrrden

+0

@borrrden отредактировал –

+0

Хорошо, простите об этом, следующий вопрос ... где вы делаете «defaultSource»? Я думаю, вам, возможно, понадобится воссоздать его * после того, как вы получите разрешение. – borrrden

ответ

1

Вы используете CFDataRef по мере необходимости, но управление памятью в неисправном состоянии. Обработчик завершения не будет выполняться в строке, и к этому времени data будет освобожден. Это делает vCardData свисающим указателем, создающим плохой доступ. Чтобы исправить это, вместо __bridge используйте __bridge_retained, а затем позвоните CFRelease по телефону vCardData, как только вы закончите.

ABRecordRef defaultSource = ABAddressBookCopyDefaultSource(addressBook); 
NSData *data=[vcardString dataUsingEncoding:NSUTF8StringEncoding]; 
CFDataRef vCardData = (__bridge_retained CFDataRef)data; 
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 
    if(granted) 
    { 
     NSLog(@"%@",vcardString); 
     CFArrayRef vCardPeople = ABPersonCreatePeopleInSourceWithVCardRepresentation(defaultSource, vCardData);//BAD_ACCESS ERROR 
     CFRelease(vCardData); 
     for (CFIndex index = 0; index < CFArrayGetCount(vCardPeople); index++) { 
     //... 
+0

Удивительный! Это сделал трюк. Благодарим группу: D –

 Смежные вопросы

  • Нет связанных вопросов^_^