0

アドレス帳の連絡先を読んでいます...名前のない連絡先をテストするまで、すべてがうまくいきます(メールや電話などで連絡先を作成できるため....)。コード(縮小)は次のとおりです。

- (NSMutableArray *) getContactsInfo {
    NSMutableArray *contactsList = [[NSMutableArray alloc] init];
    localAddressBook = ABAddressBookCreate();

    int contactsLength = (int)ABAddressBookGetPersonCount(localAddressBook);

    if (contactsLength < 1)
        return nil;

    for(int currentContact=1; currentContact < (contactsLength + 1); currentContact++) {
        ABRecordRef person = ABAddressBookGetPersonWithRecordID(localAddressBook,(ABRecordID) currentContact);

        firstName = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);
        NSLog(@"%@", firstName);

        [contactsList addObject:firstName];
        CFRelease(person);
    }

    return contactsList;
}

そして、私が得る出力はこれです:

2010-02-15 14:16:25.616 testApp[7065:207] Contact0
2010-02-15 14:16:25.618 testApp[7065:207] Contact1
2010-02-15 14:16:25.619 testApp[7065:207] Contact2
Program received signal:  “EXC_BAD_ACCESS”.

名前と姓の連絡先が 3 つあり、テスト目的で姓だけで作成された連絡先が 1 つあります。

配列を使用してメールや住所などのプロパティを適切に読み取ることができるようですが、連絡先に First Name プロパティがない場合、アプリがクラッシュします。

4

4 に答える 4

1

NSZombies を有効にして、EXEC_BAD_ACCESS がどこから来ているかを正確に確認したい場合があります。

于 2010-02-15T19:54:53.260 に答える
0

問題は確かに nil の名前にありますが、ログ ステートメントではなく、配列に nil を挿入しようとする場所です。クラッシュの原因となる nil 値を配列に挿入することはできません。NSLog はまだ出力をコンソールにフラッシュしていません。そのため、最初の名前が nil であるという最後のログ ステートメントがまだ表示されていません。

アドレス帳からデータを取得するときはいつでも、何かに挿入する前に値が nil かどうかを確認してください。

于 2010-02-15T22:01:53.637 に答える
0

確認するために、クラッシュは初めて使用しようとしたときではなく、内部 で発生しています (これは NULL である可能性がありますか?) また、 NULL でもありませんよね? (一般的に、クラッシュしている行に関する詳細とともに、質問のコードが増えると役立ちます。)ABRecordCopyValuefirstNameperson

もう 1 つ試すことはperson、 an にキャストして;ABRecord*を使用することです。[valueForProperty][1]2 つのタイプは無料でブリッジされており、後者からは異なる結果が得られる可能性があります (私には疑問ですが)。

更新: 投稿したコードを指定してfirstName、出力する前に NULL ではないことを確認する必要があります。単純に NULL を返すNSLog可能性が非常に高くなりABRecordCopyValueます (そのレコードに名データが存在しないという事実を表しています)。personref 値自体の有効性を確認してください。直接 NULL を渡すABRecordCopyValueと、追加の問題が発生する可能性があります。

于 2010-02-15T19:35:27.097 に答える