0

私は Objective C を初めて使用し、緊急にアプリを作成する必要がある立場にあります。XCode 4.2 を使用しています

アプリの一部で QR コードを検出し、NSString 形式の VCard を取得します: 次のコードを使用して関数を実行しました: -以下をフレームワークにインポートしました:

AddressBookUI.framework
AddressBook.framework

私が書いた.hファイルに:

#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 形式で) アドレス帳に保存する唯一の方法ですか? 他の提案はありますか?

4

2 に答える 2

1

ARCが有効になっていると仮定しています。

CFRetainオブジェクトを使用中にing するとvCardData、クラッシュが停止しますか? データ オブジェクトは、おそらくスコープが終了するまでしか存続しません。

または、おそらくより良い、使用__bridge_retained

ARC のリリース ノートを参照してください。

于 2011-11-16T16:42:04.037 に答える