1

ABRecordRef's配列への格納に問題があります。これは、この stackoverflowの問題と非常によく似ているようです。ただし、回避策を見つけるだけでなく、問題が何であるかを把握しようとしています。ここで本当に単純なものが欠けているような気がします。

もともと私の問題は、画像があるそれぞれのサムネイル画像を取得するPersonことでした。それ以来、テストアプリでコードを簡素化しましたが、同じ問題もありABPersonHasImageDataます。

非常に簡単に言えば、ABRecordRef'sそれらを取得して に追加しますNSMutableArray。それらを追加した後、画像データがあるかどうかを確認するためにいくつかのチェックを行います。それらはすべて最初に行います。後で、my のほとんどすべてのエントリでNSMutableArray、配列の最初のエントリを除いて、画像データがないことがわかります。同じ から名、姓、および他の多くの値を取得できますABRecordRefsが、画像データは取得できません。

これが私のコードです。

私はこのように追加しABRecordRefsます:

- (void) storePerson:(ABRecordRef) person
{
    if (!_persons) {
        _persons = [[NSMutableArray alloc] init];
    }
    [_persons addObject:(__bridge id)(person)];
}

すぐにチェックを実行し、そのチェックを頻繁に繰り返します。

- (void) checkPersons
{
    for (UInt16 i = 0; i < _persons.count; i++) {
        ABRecordRef person = (__bridge ABRecordRef)(_persons[i]);
        NSData *data = (__bridge_transfer NSData *)(ABPersonCopyImageDataWithFormat (person, kABPersonImageFormatThumbnail));
        NSLog(@"index %d is %@ and it %@ image", i, person, ABPersonHasImageData(person)?@"HAS an": @"has NO");

    }
}

即時チェックと 1 秒後のチェックの結果は次のとおりです。

2013-07-05 00:45:30.980 lmiy[5300:907] index 0 is <CPRecord: 0x1c59d8b0 ABPerson> and it HAS an image
2013-07-05 00:45:31.893 lmiy[5300:907] index 0 is <CPRecord: 0x1c59d8b0 ABPerson> and it HAS an image

次に、別の人を配列に追加します。最初の人はもうイメージを持っていないようです:

2013-07-05 00:45:40.080 lmiy[5300:907] index 0 is <CPRecord: 0x1c59d8b0 ABPerson> and it has NO image
2013-07-05 00:45:40.082 lmiy[5300:907] index 1 is <CPRecord: 0x1c59aa60 ABPerson> and it HAS an image

第三者を追加すると、2 人目の人物のイメージも失われます。

2013-07-05 00:48:30.867 lmiy[5300:907] index 0 is <CPRecord: 0x1c59d8b0 ABPerson> and it has NO image
2013-07-05 00:48:30.869 lmiy[5300:907] index 1 is <CPRecord: 0x1c59aa60 ABPerson> and it has NO image
2013-07-05 00:48:30.872 lmiy[5300:907] index 2 is <CPRecord: 0x1c59d450 ABPerson> and it HAS an image

画像データが揮発性で保存され、何らかの形でフラッシュされるようです。最初にすべての画像データを取得して保存する必要はありません。これを引き起こしているのは何ですか?このようにしがみついて使用するのは間違っていABRecordRefsますか?

更新: 多くの場合、_persons 配列への最初のエントリ (インデックス 0 のエントリ) が画像を返し、残りのエントリは画像がないことを示します。

4

0 に答える 0