我对检查对象的保留计数有一点疑问:
请找到下面的代码,释放对象内存后显示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;
}
答案 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
)。