0

アプリ ドキュメント ディレクトリの vcf ファイルから vcard データを文字列に取得しています。文字列は問題ありませんが、 ABPersonCreatePeopleInSourceWithVCardRepresentationBAD_ACCESS エラーがスローされます。コードはこちら...

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:carljosdsdsewhnson.akasdssh@gmail.com

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

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

....LOT OF GIBBERISH....

END:VCARD
4

1 に答える 1

1

必要に応じて使用しCFDataRefていますが、メモリ管理がうまくいきません。完了ハンドラはインラインで実行されず、その時点dataまでに割り当てが解除されます。これによりvCardData、ダングリング ポインターが作成され、アクセスが悪くなります。これを修正するには、__bridge使用する代わりに、完了したら__bridge_retained呼び出します。CFReleasevCardData

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++) {
        //...
于 2013-03-29T10:21:00.490 に答える