使用相同的默认 UIImage 对象进行单元重用/初始化
Posted
技术标签:
【中文标题】使用相同的默认 UIImage 对象进行单元重用/初始化【英文标题】:Using same default UIImage object for cell reuse/initialisation 【发布时间】:2018-12-29 10:38:48 【问题描述】:我对在tableView
委托方法_cellForRowAtIndexPath_
中的单元格配置期间使用存储在Assests.xcassets
中的默认UIImage 存有疑问。考虑以下代码 sn-p:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier:newItemCellResueId , for: indexPath) as? MyCustomCell
cell?.imageView?.image = defaultImage
//After this we do all other stuff that needs to be done with the cell
return cell
其中 defaultImage 是我的类的存储属性,初始化如下:-
var defaultImage = UIImage(named: "Default")
现在我的问题是这个。由于 image 是单元格 imageView 的子视图,因此当我将单元格的 imageView.image 设置为等于我存储的属性的实例时,我假设它将被添加为子视图到该单元格的 imageView。如果是这样,单个默认 UIImage 实例如何作为子视图添加到多个单元格?如果不是,它是否会生成此 UIImage 的不同实例并将它们添加到单元格中?如果是,我们为什么不担心所有这些 defaultImage 实例的内存占用(缓存等)(就像我们为 TableViewControllers 异步获取的图像所做的那样)
【问题讨论】:
图片不是子视图。UIImage
不继承自 UIView
。图像在图像视图中呈现。它本质上是一个位图。该位图可以同时由任意数量的UIImageView
s 渲染。
【参考方案1】:
UIImage
不是UIView
的子类,也不会添加为UIImageView
的子视图。 UIImageView
是一个UIView
,可以渲染一个UIImage
。
由于UIImage
是一个不可变对象,多个UIImageViews
可以安全地引用同一个UIImage
。
UIImage(named:)
初始化器使用内部内存缓存,因此无论您是对默认图像使用单个属性,还是重复使用 UIImage(named:)
初始化器,都不会影响应用的内存占用。
【讨论】:
【参考方案2】:由于图像是单元格的 imageView 的子视图
不,不是。 image
只是 UIImageView
的属性,类型为 UIImage?
的图像,显示在图像视图中 (docs)。
现在,如果您有单元格的默认图像,您不必担心“内存占用”,您可以将其设置在 cellForRowAt
cell?.imageView?.image = UIImage(named: "Default")
【讨论】:
【参考方案3】:试试这个。
从 Assets.xcassets 添加新的图像集。并将其命名为“测试”
它将打印带有 5 个时间图像的 tableview。
import UIKit
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad()
super.viewDidLoad()
tableView.delegate=self
tableView.dataSource=self
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier:"cell") as UITableViewCell!
cell.imageView?.image=UIImage(named:"test")
return cell
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 5
【讨论】:
以上是关于使用相同的默认 UIImage 对象进行单元重用/初始化的主要内容,如果未能解决你的问题,请参考以下文章
使用 SDWebImage 为 UICollectionView 可重用单元从路径加载图像 - Swift
自定义 UITableView 单元格图像转换未应用于可重用单元格
当它们几乎没有区别时,我应该重用 tableView 单元格吗? [关闭]