Сохранение проблемы с количеством в iPhone SDK - PullRequest
0 голосов
/ 22 августа 2011

У меня есть небольшие сомнения по поводу проверки сохранения количества объектов:

Найдите приведенный ниже код, он отображает значение retainCount, равное 1, после освобождения памяти объекта.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        CGRect contentRect = [cell.contentView bounds];     
        UIImageView *thumbView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:IMAGE_CELL_BACKGROUND]];
        thumbView.frame = contentRect;      
        cell.backgroundView=thumbView;
        [thumbView release];
    }
    UIImageView *image=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"left_arrow.png"]];
    **NSLog(@"Image retain count %d",[image retainCount]);**
    image.frame=CGRectMake(290, 12.5, [UIImage imageNamed:@"left_arrow.png"].size.width,  [UIImage imageNamed:@"left_arrow.png"].size.height);
    image.backgroundColor=[UIColor clearColor];
    [cell.contentView addSubview:image];
    [image release];
    **NSLog(@"Image retain count-- after %d",[image retainCount]);**


        // Configure the cell...

    return cell;
}

Ответы [ 2 ]

6 голосов
/ 22 августа 2011

Это совершенно нормально. cell.contentView по-прежнему содержит ссылку на изображение. Когда вы вызываете [cell.contenetView addSubview:image], cell.contentView сохраняет ссылку на изображение где-то (возможно, в массиве или чем-то подобном) и увеличивает счетчик ссылок на 1, чтобы гарантировать, что image не освобожден, пока cell.contentView все еще использует Это. Всякий раз, когда cell.contentView освобождается по какой-либо причине, это гарантирует, что количество сохраненных изображений будет уменьшено на 1.

1 голос
/ 22 августа 2011

Вызов addSubview: в строке перед [image release] заставляет contentView ячейки сохранить представление изображения, поэтому вполне ожидаемо, что после этого счетчик сохранения будет равен 1 - было бы довольно плохо, если бы он был равен нулю, потому что Вы (или, скорее, ячейка contentView) по-прежнему нуждаетесь в представлении изображения в памяти.

Выпустив его, вы, по сути, дали contentView исключительную ответственность за выпуск представления изображения, когда оно само освобождается или больше не нуждается в нем (например, если вызывается removeFromSuperview).

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