CFArrayGetValueAtIndex возвращает не-ABRecordRef - PullRequest
1 голос
/ 12 сентября 2011

У меня произошел сбой на iPhone некоторых пользователей, и, наконец, у меня появился человек, с которым я могу воспроизвести проблему. Вот ключевой сегмент кода

ABAddressBookRef addressbook = ABAddressBookCreate();
if( addressbook )
{
    //Got this via /3038604/primer-koda-dlya-abaddressbookcopyarrayofallpeopleinsourcewithsortordering
    ABRecordRef source = ABAddressBookCopyDefaultSource(addressbook);
    CFArrayRef sortedPeople = ABAddressBookCopyArrayOfAllPeopleInSourceWithSortOrdering(addressbook, source, kABPersonSortByFirstName);
    //Sort them first

    if( sortedPeople )
    {
        CFIndex contactCount = ABAddressBookGetPersonCount(addressbook);

        for( int i = 0; i<contactCount; i++ )
        {
            ABRecordRef ref = CFArrayGetValueAtIndex(sortedPeople, i);
            NSMutableString *fName = [[[NSMutableString alloc] init] autorelease];
            NSMutableString *lName = [[[NSMutableString alloc] init] autorelease];
            NSMutableDictionary *identifiers = [[[NSMutableDictionary alloc]init]autorelease];
            if( ref )
            {
                //Get the user's name first
                NSLog(@"%@ is the reference", ref);
                CFStringRef firstName = ABRecordCopyValue(ref, kABPersonFirstNameProperty);
                if( firstName )
                {
                    NSString *fn = [NSString stringWithFormat:@"%@",firstName];
                    if([fn hasPrefix:@"(null"])
                        [fName appendString:@""];
                    else
                    {
                        [fName appendString:[NSString stringWithFormat:@"%@", firstName]];
                        [fName setString:[fName stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[fName substringToIndex:1]uppercaseString]]];
                    }
                    CFRelease(firstName);
                }
           }
       }
   }
}

Видимо, результат этой строки кода: ABRecordRef ref = CFArrayGetValueAtIndex (sortedPeople, i);

Иногда возвращается как NSCFType вместо ABPerson. Любая идея о том, как проверить тип результата? Я пытаюсь предотвратить это от сбоя телефона пользователя. Как только я доберусь до этой строки:

 ABRecordCopyValue(ref, kABPersonFirstNameProperty);

Я получаю EXC_BAD_ACCESS в этой строке. И это происходит, когда файл журнала выглядит так:

2011-09-11 17:24:31.355 Holler[1345:707] <CPRecord: 0x6642fb0 ABPerson> is the reference
2011-09-11 17:24:31.358 Holler[1345:707] <CPRecord: 0x66431d0 ABPerson> is the reference
2011-09-11 17:24:31.361 Holler[1345:707] <CPRecord: 0x66433b0 ABPerson> is the reference
2011-09-11 17:24:31.365 Holler[1345:707] <CPRecord: 0x6640fd0 ABPerson> is the reference
2011-09-11 17:24:31.369 Holler[1345:707] <CPRecord: 0x6643510 ABPerson> is the reference
2011-09-11 17:24:31.372 Holler[1345:707] __NSCFType is the reference

Любая помощь будет принята с благодарностью !!!

Ответы [ 2 ]

7 голосов
/ 12 сентября 2011

Я почти уверен, что происходит сбой, потому что contactCount установлен неправильно:

  • sortedPeople установлен для всех людей из одного источника
  • для contactCount задано количество всех людей в адресной книге

Так что, если у вас есть несколько источников, содержащих людей для вашей адресной книги, итерация выйдет за пределы sortedPeople. Чтобы это исправить, замените

CFIndex contactCount = ABAddressBookGetPersonCount(addressbook);

с

CFIndex contactCount = CFArrayGetCount(sortedPeople);
0 голосов
/ 12 сентября 2011

Вы можете проверить результат в адресной книге с помощью ABRecordGetRecordType(ref) == kABPersonType, чтобы убедиться, что это ABPerson, а не ABGroup.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...