在iOS中,UIImageView.image是否应设置为“0”;“无”;在为其分配新的UIImage之前?
在iOS中,在为UIImageView.image分配新的UIImage之前,是否应将其设置为“nil”在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
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,这没有帮助。有办法解决我的问题吗?