1

在 iOS 中,UIImageView.image 是否应该在分配新的 UIImage 之前设置为“nil”?

myUIImageView.image = nil;

myUIImageView.image = [UIImage imageNamed:@"talkButton.png"];

这是正确的方法吗?

4

3 回答 3

2

如果您担心引用计数,那么显式分配 tonil是不必要的;在 ARC 下,该.image属性将自动为您处理(分配新图像时)。

设置nil 有用的地方是您希望将图像明确标记为不再使用,但不想删除/删除UIImageView本身或设置新图像。在这些情况下,设置.image = nil是一个好主意。

于 2013-09-17T00:43:13.627 回答
2

如果您使用 setter,则无需在更改属性之前将其设置为 nil。setter 将在分配新的引用之前释放当前引用。

于 2013-09-17T00:43:37.070 回答
1

但是,当您在重复使用的视图(例如表格/集合视图单元格)中异步设置图像时,您会经常看到这种模式。您在这里似乎没有这样做,因此将 设置imagenil此处并没有太大的作用,但上述情况是清除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;
}
于 2013-09-17T01:32:14.700 回答