Ошибка адресной книги iOS на ABMultiValueRef - PullRequest
1 голос
/ 12 августа 2011

У меня проблема с доступом к адресной книге моего iPad 2. В частности, у меня проблемы с получением электронной почты моих контактов. Я хочу получить доступ к адресной книге, получить мои контакты и показать их в виде таблицы. Кажется, все работает нормально, так как отображаются имя и фамилия контактов. Проблема связана со свойством электронной почты, так как при попытке получить его я получаю «EXC_BAD_ACCESS». Код, который я написал, чтобы показать запись таблицы, выглядит следующим образом:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *tableIdentifier = @"tableIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:tableIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:tableIdentifier] autorelease];
    }

    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.textLabel.backgroundColor = [UIColor clearColor];
    cell.detailTextLabel.backgroundColor = [UIColor clearColor];

    NSUInteger row = [indexPath row];

    NSString *firstName = (NSString *)ABRecordCopyValue([contacts objectAtIndex:row], kABPersonFirstNameProperty);
    NSString *lastName = (NSString *)ABRecordCopyValue([contacts objectAtIndex:row], kABPersonLastNameProperty);
    NSString *name = [[NSString alloc] initWithFormat:@"%@ %@", lastName,firstName];

    [firstName release];
    [lastName release];

    cell.textLabel.text = name;

    [name release];

    NSArray *emails = [[self getEmailForPerson:row] retain];

    /*......*/  

    return cell;
}

Хотя функция получения электронной почты моих контактов следующая:

- (NSArray *)getEmailForPerson:(NSInteger)index{
    //Create the array where emails will be stored
    NSMutableArray *m = [[[NSMutableArray alloc] init] autorelease];
    //Get the email properties
    ABMultiValueRef mails = ABRecordCopyValue([self.contacts objectAtIndex:index], kABPersonEmailProperty);
    //Iterate in the multi-value properties
    for (int i=0; i<ABMultiValueGetCount(mails); i++) {
        //Get the email
        NSString *mail = (NSString *) ABMultiValueCopyValueAtIndex(mails, i);
        //Add the email to the array previously initializated
        [m addObject:mail];
        [mail release];
    }
    CFRelease(mails);

    return m; 
}

Когда я запускаю отладчик после этого оператора

ABMultiValueRef mails = ABRecordCopyValue([self.contacts objectAtIndex:index], kABPersonEmailProperty);

письма, похоже, не инициализированы, поскольку их адрес равен 0x0, но я не могу понять, почему. Я надеюсь, что кто-нибудь может мне помочь.

Заранее спасибо

1 Ответ

1 голос
/ 19 августа 2011
ABMultiValueRef mails = ABRecordCopyValue([self.contacts objectAtIndex:index], kABPersonEmailProperty);

Отлично работает в моем приложении.

Проверьте рамки и self.contacts.

Мое приложение использует две платформы.

#import <AddressBook/AddressBook.h>
#import <AddressBook/ABAddressBook.h>
...