UITableView с проблемами изображения контакта - PullRequest
0 голосов
/ 14 марта 2010

В соответствии с требованиями моего приложения, я показываю изображения контактов в UITableView, как показано ниже.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath
                                                              (NSIndexPath *)indexPath
{
    //NSMutableArray *sourceArray = sourceList;
    static NSString *identifier = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil)
    {
        //If not possible create a new cell
        cell = [[[UITableViewCell   alloc]initWithStyle:UITableViewCellStyleDefault                     
             reuseIdentifier:identifier] autorelease];
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
        cell.opaque = NO;

        CGRect LabelFrame = CGRectMake(130, 33, 150, 13);
        callImage = [[UIImageView alloc] initWithFrame:LabelFrame];//phone image
        callImage.tag = 1;
        [cell.contentView addSubview:callImage];
        [callImage release];
            -----
            -----
    }
    UIImageView *callImage = (UIImageView *)[cell viewWithTag:1];
    ABRecordRef contact = [self getContact];
    if(contact && ABPersonHasImageData(contact))
    {
        UIImage *contactImage = [UIImage imageWithData:(NSData*)ABPersonCopyImageData(contact)];
        callImage.image =  contactImage;
    }
}

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

  1. Таблица прокручивается слишком медленно. Если прокомментировать код «добавления изображения», то UITable отвечает очень быстро.
  2. Управление памятью. Мое приложение начало использовать 25 - 30 МБ оперативной памяти.

Есть ли лучший способ избежать двух вышеуказанных проблем?

Ответы [ 2 ]

1 голос
/ 16 марта 2010

У вас есть утечка памяти в коде "добавления изображения". ABPersonCopyImageData возвращает сохраненный объект NSData, который вам нужно освободить после использования его для инициализации UIImage, например:

NSData *contactImageData = (NSData*)ABPersonCopyImageData(contact);
UIImage *contactImage = [UIImage imageWithData:];
[contactImageData release];

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

0 голосов
/ 25 июня 2010

Как насчет предварительного кэширования изображений? Если у вас есть доступ к подсистеме адресной книги для каждой ячейки, это может быть проблемой? Другой проблемой может быть вызов imageWithData, поскольку каждый раз изображение должно создаваться с нуля. Здесь нет кэширования изображений. Если вы делаете это перед построением таблицы (обращаясь к cellForRow с этим) и сохраняете предварительно визуализированные изображения в NSMutableDictionary с ключом ABRecordID?

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