在 iOS 中,UIImageView.image 是否应该在分配新的 UIImage 之前设置为“nil”?
myUIImageView.image = nil;
myUIImageView.image = [UIImage imageNamed:@"talkButton.png"];
这是正确的方法吗?
在 iOS 中,UIImageView.image 是否应该在分配新的 UIImage 之前设置为“nil”?
myUIImageView.image = nil;
myUIImageView.image = [UIImage imageNamed:@"talkButton.png"];
这是正确的方法吗?
如果您担心引用计数,那么显式分配 tonil
是不必要的;在 ARC 下,该.image
属性将自动为您处理(分配新图像时)。
设置nil
为有用的地方是您希望将图像明确标记为不再使用,但不想删除/删除UIImageView
本身或设置新图像。在这些情况下,设置.image = nil
是一个好主意。
如果您使用 setter,则无需在更改属性之前将其设置为 nil。setter 将在分配新的引用之前释放当前引用。
但是,当您在重复使用的视图(例如表格/集合视图单元格)中异步设置图像时,您会经常看到这种模式。您在这里似乎没有这样做,因此将 设置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;
}