Почему эта линия пропускает память? - PullRequest
3 голосов
/ 09 сентября 2009

Любые идеи, почему строка ниже будет утечка памяти?

cell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:person.imageURL]];

в методе cellForRowAtIndexPath:

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

    if (cell == nil){
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"PersonCell"] autorelease];
    }
    Person *person = [[Person alloc] initWithUserName:[people objectAtIndex:indexPath.row]];

    cell.imageView.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:person.imageURL]];

    cell.textLabel.text = [people objectAtIndex:indexPath.row];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    [person release];

    return cell;
}

А вот соответствующий метод от person.m

- (NSURL*) imageURL
{
    return [NSURL URLWithString:[userInfo valueForKey:@"profile_image_url"]];
}

РЕДАКТИРОВАТЬ: добавлен метод инициализации:

- (id)initWithUserName:(NSString *)user{

    userName = [user copy];
    userInfo = [[TwitterHelper fetchInfoForUsername:userName] retain];  
    updates = [[TwitterHelper fetchTimelineForUsername:userName] retain];

    return self;
}

Ответы [ 5 ]

2 голосов
/ 09 сентября 2009

Единственное, о чем я могу здесь думать, что это может быть причиной утечки, это то, что вы, возможно, сохраняете imageURL в своем классе person и не имеете релиза в его методе dealloc. Таким образом, когда вы освобождаете человека, он пропускает свойство imageURL.

1 голос
/ 13 октября 2009

у вас есть сделка для человека?

Естественно, что эти три строки - утечка, если вы не выпускаете их в dealloc:

userName = [user copy];
userInfo = [[TwitterHelper fetchInfoForUsername:userName] retain];  
updates = [[TwitterHelper fetchTimelineForUsername:userName] retain];
1 голос
/ 10 сентября 2009

UIImage много кеширует. Может показаться, что произошла утечка, если UIImage содержит кэш изображения.

1 голос
/ 10 сентября 2009

Попробуйте разделить строку и протестировать снова. Это может дать вам некоторое представление.

NSURL *imgURL = person.imageURL;
NSData *imgData = [NSData dataWithContentsOfURL:imgURL]
cell.imageView.image = [UIImage imageWithData: imgData];

И вы можете прокомментировать последние, чтобы увидеть, если первый вызывает утечки.

Вы знаете, насколько велика утечка? Размер изображения или URL?

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

Это может быть связано с автоматическим выпуском.

Конструкторы типа [NSData dataWithContentsOfURL:...] в Какао автоматически высвобождаются автоматически. Этот вызов эквивалентен [[[NSData alloc] initWithContentsOfURL:...] autorelease]. Это может быть как-то связано с этим.

...