освобождение всех ячеек в таблице ios iphone - PullRequest
2 голосов
/ 22 марта 2011

У меня обнаружена проблема утечки памяти при профилировании в xcode.Проблема довольно простая, но я не могу понять, как ее исправить:

Рассмотрим контроллер uiview с 2 кнопками и табличным представлением.button1 = загрузить данные JSON с сервера и добавить ячейки в представление таблицы, затем [tableview reloadData]

button2 = загрузить данные JSON с другого сервера и добавить ячейки в просмотр таблицы, а затем перезагрузить.

ок, проблема в:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
....
.....
NSURL *url = [NSURL URLWithString:stringpath];
NSData *data = [NSData dataWithContentsOfURL:url];
UIImage *img;
if(!data) img=[UIImage imageNamed:@"small.jpg"];
else img= [[UIImage alloc] initWithData:data];
cell.imageView.image = img;

Хорошо, теперь, если я начинаю переключаться с 2 кнопками каждый раз, когда я переключаюсь, я получаю утечку из UIImage, поэтому я думаю, что мне нужно «очистить» (освободить) все данные ячеек перед перезагрузкой?

Thx

Ответы [ 4 ]

2 голосов
/ 22 марта 2011

Вы должны освободить объект img после установки его в cell.imageView.image. Я предпочитаю autorelease на одной линии, так как мне легче отслеживать.

UIImage *img;
if(!data) img=[UIImage imageNamed:@"small.jpg"];
else img= [[[UIImage alloc] initWithData:data] autorelease];
cell.imageView.image = img;

Как уже упоминалось в другом ответе, вы можете избавить себя от боли, не используя вызов initWithData, а вместо этого imageWithData.

Клетки позаботятся о себе.

1 голос
/ 22 марта 2011

Я бы заменил эту строку:

else img= [[UIImage alloc] initWithData:data];

на:

else img= [UIImage imageWithData:data];
1 голос
/ 22 марта 2011

Проблема не выпускается img, пожалуйста, используйте ниже

if (!data) 
{
    img = [UIImage imageNamed:@"small.jpg"];
    cell.imageView.image = img;
}
else 
{
    img = [[UIImage alloc] initWithData:data];
    cell.imageView.image = img;
    [img release];
}
0 голосов
/ 22 марта 2011

Вам не нужно выделять память для UIImage. Вы можете выполнить вышеуказанную реализацию следующим образом:

NSData * data = [NSData dataWithContentsOfURL: url];
cell.imageView.image = [UIImage imageWithData: data];

Попробуйте это.

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