2010-12-02 6 views
1

誰かがこれに簡単に答えられるかもしれません。私はどこに新しいアドレス帳を呼び出して毎回呼び出していたcellForRowAtIndexPath内の各行の情報を取得するiphoneアプリケーションに取り組んでいます:addressBookインスタンス変数を正しく設定する方法はありますか?

ABAddressBookRef addressBook = ABAddressBookCreate();

これは遅い以外はうまく動作し、各行に新しいabを作成するのが正しいとは感じません。だから、私はaddressBookインスタンス変数を作成しましたが、クラッシュすることなく使用することはできません。 (プログラム受信信号: "EXC_BAD_ACCESS") 私はそれを正しく設定していないと思っていますが、文書でこれについて具体的に何かを見つけることはできませんでした。

お手数をおかけしておりますことをお手伝いします。

ABAddressBookRef addressBook; 


@property(nonatomic, readwrite) ABAddressBookRef addressBook; 

その後、私の.mファイル内:私はこれをしなかった私の.hファイルで

-(id)initWithStyle:(UITableViewStyle)style 
{ 
    if (self = [super initWithStyle:style]) { 

     addressBook = ABAddressBookCreate(); 
    } 

    return self; 
} 
+0

なぜ各行に​​ 'ABAddressBookRef'を作成していますか?それらはすべて同じ共有システムのアドレス帳を指しています。すべての行で使用されているものを使用するほうが意味があります。 –

答えて

0

あなたはCFRelease(アドレス帳)でアドレス帳を解放するのですか?メモリが足りない場合、ABAddressBookCreate()は無名オブジェクトを返します。 CベースのaddressBook.framework APIはnilオブジェクトでは動作できず、 "EXC_BAD_ACCESS"でクラッシュします。

+0

ご返信ありがとうございます。私はこれをdeallocメソッドで次のように解放しています: - (void)dealloc { \t CFRelease(addressBook);}注意:アドレス帳には2つまたは3つのレコードしか含まれていなくてもクラッシュしました。 –

+0

私は別の場所に論理的な誤りがあると思います。情報が少なすぎて、なぜクラッシュするのか分かりません。 – AechoLiu

+0

ありがとうございます。それは副次的な原因でなければなりませんが、私が本当に知りたいのは、上記のコードがaddressBook ivarを設定する正しい方法かどうかです。なぜなら私がcellForRowAtIndexPathにABを直接作成して何も変えないからです。そのアイデアは両方の方法でパフォーマンスをテストすることでしたが... –

関連する問題