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

时间:2013-09-17 00:40:45

标签: ios objective-c uiimageview

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

myUIImageView.image = nil;

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

这是正确的方法吗?

3 个答案:

答案 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;
}