在iOS中,在将UIImageView.image分配给新的UIImage之前,是否应将其设置为“nil”?
myUIImageView.image = nil;
myUIImageView.image = [UIImage imageNamed:@"talkButton.png"];
这是正确的方法吗?
答案 0 :(得分:2)
如果您担心引用计数,则无需明确指定nil
;在ARC下,.image
属性将自动为您处理(分配新图像时)。
设置为nil
有用的地方是您要将图片明确标记为不再使用,但又不想删除/删除UIImageView
本身或设置新图像。在这些情况下,设置.image = nil
是一个好主意。
答案 1 :(得分:2)
如果您使用setter,则无需在更改之前将属性设置为nil。设定者将在分配新参考之前释放当前参考。
答案 2 :(得分:1)
但是,当您在重用的视图(例如表/集合视图单元格)中异步设置图像时,您会经常看到此模式。您似乎没有在此处执行此操作,因此在此处将image
设置为nil
并不会有太大作用,但上述情况是清除image
非常重要的一种情况因为(a)如果一个单元格被重用,前一个图像可能仍然在那里,但是(b)如果你是异步检索图像,可能需要一些时间来加载新图像,所以你会看到前一个图像暂时除非你nil
。
例如,您希望在这种情况下将图像设置为nil
:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"Cell";
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
// configure the rest of the cell
// ok, now set the image
cell.myUIImageView.image = nil; // clear the image in case the cell has been reused
[self.networkQueue addOperationWithBlock:^{
UIImage *image = [self getImageFromNetworkForIndexPath:indexPath];
cell.myUIImageView.image = image;
}];
return cell;
}