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

在iOS中,UIImageView.image是否应设置为“0”;“无”;在为其分配新的UIImage之前?,ios,objective-c,uiimageview,Ios,Objective C,Uiimageview,在iOS中,在为UIImageView.image分配新的UIImage之前,是否应将其设置为“nil” myUIImageView.image = nil; myUIImageView.image = [UIImage imageNamed:@"talkButton.png"]; 这是正确的方法吗?如果您担心引用计数,则不需要显式分配到nil;在ARC下,.image属性将自动为您处理该问题(当分配新图像时) 如果设置为nil很有用,则您希望明确地将图像标记为不再使用,但不希望删除UIIm

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

myUIImageView.image = nil;

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

这是正确的方法吗?

如果您担心引用计数,则不需要显式分配到
nil
;在ARC下,
.image
属性将自动为您处理该问题(当分配新图像时)


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

如果您担心引用计数,则无需显式指定
nil
;在ARC下,
.image
属性将自动为您处理该问题(当分配新图像时)


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

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

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

但是,当您在重用的视图(如表/集合视图单元格)中异步设置图像时,您将经常看到此模式。您在这里似乎没有这样做,因此在这里将
图像设置为
nil
不会有多大效果,但是前面提到的场景是这样一种情况,清除
图像非常重要,因为(a)如果重复使用单元格,前一个图像可能仍然存在,但是(b)如果您正在异步检索图像,则加载新图像可能需要一段时间,因此您将立即看到上一个图像,除非
nil
it

例如,在这种情况下,您可能希望将图像设置为
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;
}

但是,在重用的视图(如表/集合视图单元格)中异步设置图像时,您会经常看到此模式。您在这里似乎没有这样做,因此在这里将
图像设置为
nil
不会有多大效果,但是前面提到的场景是这样一种情况,清除
图像非常重要,因为(a)如果重复使用单元格,前一个图像可能仍然存在,但是(b)如果您正在异步检索图像,则加载新图像可能需要一段时间,因此您将立即看到上一个图像,除非
nil
it

例如,在这种情况下,您可能希望将图像设置为
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;
}

分配nil并没有什么坏处,在某些情况下(可能不是在设置属性时),这并不是一个坏习惯,但不是必需的。只是不要像某些人那样认为你必须在那里alloc/init一个值来“创建”指针。赋值为nil没有什么坏处,在某些情况下(可能不是在设置属性时),这并不是一个坏习惯,但这不是必需的。只是不要像某些人那样认为你必须在那里alloc/init一个值来“创建”指针。如果你的属性被声明为retain或copy,你根本不必担心释放它,不管是ARC还是no。如果你的属性被声明为retain或copy,你根本不必担心释放它,不管是不是,我遇到了你描述的问题。“图像仍在可恢复的tableview单元格中”。我放置了一个图像占位符,它比我想在单元格中显示的图像大一点,当图像异步返回时,它只是显示在占位符的上方,而不是“而是”。在设置新图像之前,我将图像设置为nil,这没有帮助。我的问题有解决办法吗?我遇到了你描述的问题。“图像仍在可恢复的tableview单元格中”。我放置了一个图像占位符,它比我想在单元格中显示的图像大一点,当图像异步返回时,它只是显示在占位符的上方,而不是“而是”。在设置新图像之前,我将图像设置为nil,这没有帮助。有办法解决我的问题吗?