UITableView с изображениями, не высвобождая ресурсы - PullRequest
0 голосов
/ 12 октября 2009

У меня есть UITableView, где каждая ячейка является изображением. Только одна ячейка видна одновременно. Изображения загружаются по запросу. Пользователь прокручивает до ячейки, и ее изображение загружается.

Это мой метод cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

if (cell == nil) {
    // this is being compiled for OS 2.0, this is why I am using initWithFrame… it is working fine on 3.0 iPhone.
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0, 0, 480, 320) reuseIdentifier:MyIdentifier] autorelease];
}

UIImage *imagemX;
UIImageView *myView;

imagemX = [[[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] 
pathForResource:[NSString stringWithFormat: @"img%d", (indexPath.row+1)] ofType:@"jpg"]] autorelease];

myView = [[[UIImageView alloc]initWithImage:imagemX] autorelease];

[cell addSubview: myView];

return cell;
}

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

Я что-то упустил? Как заставить изображение освободить свои ресурсы, когда оно не видно?

Ответы [ 2 ]

4 голосов
/ 12 октября 2009

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

Лично я бы порекомендовал создать подкласс UITableViewCell с UIImageView в качестве свойства, а затем вызвать [cell setImageView:]. Если это не сработает, то перед добавлением нового обязательно удалите старое подпредставление.

0 голосов
/ 12 октября 2009

Не знаю точную причину этой проблемы, но есть ли метод, который вам нужно реализовать, который будет срабатывать, когда ячейка выходит за пределы диапазона? Здесь, может быть, вы могли бы выпустить subview / image / etc?

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