我正在浏览iPhone的桌面视图教程。下面是填充表的数据源方法。
- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{
static NSString* SimpleTableIdentifier = @"SimpleTableIdentifier";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SimpleTableIdentifier] autorelease];
}
NSUInteger row = [indexPath row];
cell.textLabel.text = [listData objectAtIndex:row];
UIImage* image = [UIImage imageNamed:@"face.png"];
cell.imageView.image = image;
//[image release];
return cell;
}
我注意到作者在将其设置为表格单元格的图标后没有释放图像。事实上,定义UITableCell.imageView.image
的源代码确实表明它是一个保留属性。如果我没有发布我自己的图像副本,则保留计数最终会在方法结束时为2。所以我决定释放它以释放内存。但是,这样做会导致iPhone模拟器在我将屏幕滑动一点时崩溃。为什么呢?
答案 0 :(得分:2)
方法imageNamed:
是一种方便的方法。换句话说,图像资源为autoreleased
。如果您尝试释放该image
个对象,那么您已经过度释放它。
修改:内存管理规则如下:每当您拨打alloc
,new
,copy
或retain
时,必须致电release
或autorelease
。
答案 1 :(得分:1)
-imageNamed:
方法返回自动释放的图像。因此,您不需要自己发布它。
代码行:cell.imageView.image = image;
负责保留需要完成的图像。
请记住,如果您在对象上调用retain
或使用alloc
创建了对象,或者在其中使用了“new”或“copy”一词的方法,则应该只调用对象的释放或自动释放。在所有其他情况下(假设它们正确地执行操作,您必须假设它们是这样),返回的对象是自动释放的。