保留iPhone SDK中的计数问题

时间:2011-08-22 19:04:08

标签: iphone cocoa memory-management

我对检查对象的保留计数有一点疑问:

请找到下面的代码,释放对象内存后显示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 个答案:

答案 0 :(得分:6)

这是完全正常的。 cell.contentView仍然保留对图像的引用。当您调用[cell.contenetView addSubview:image]时,cell.contentView将图像引用存储在某处(可能在数组或类似内容中),并将引用计数器增加1,以确保image不会被释放cell.contentView仍在使用它。每当cell.contentView因任何原因被解除分配时,它将确保图像的保留计数减少1。

答案 1 :(得分:1)

addSubview:之前的行中的[image release]调用会导致单元格的contentView保留图像视图,因此完全可以预期保留计数为1之后 - 它会很漂亮因为你(或者更确切地说是单元格的contentView)仍然需要图像视图在内存中,所以它是零。

通过发布它,你基本上赋予contentView唯一的责任,当它自身被释放或不再需要它时释放它(例如,如果调用removeFromSuperview)。