使用相同的默认UIImage对象进行单元重用/初始化

时间:2018-12-29 10:38:49

标签: ios swift uitableview uiimage

对于在Assests.xcassets委托方法tableView进行单元配置期间使用默认存储在_cellForRowAtIndexPath_中的UIImage,我有一个疑问。考虑以下代码片段:

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的异步获取图像所做的那样)

3 个答案:

答案 0 :(得分:2)

  

由于图像是单元格imageView的子视图

不,不是。 image只是图像类型UIImageView的{​​{1}}的属性,显示在图像视图(docs)中。

现在,如果您具有默认的单元格图片,则不必担心“内存占用”,可以在UIImage?内进行设置

cellForRowAt

答案 1 :(得分:2)

UIImage不是UIView的子类,并且不会添加为UIImageView的子视图。 UIImageView是可以呈现UIView的{​​{1}}。

由于UIImage是不可变的对象,因此多个UIImage可以安全地引用相同的UIImageViews

UIImage初始化程序使用内部内存缓存,因此,无论是对默认图像使用单个属性还是重复使用UIImage(named:)初始化程序,都不会影响应用程序的内存占用量。

答案 2 :(得分:0)

尝试一下。

  1. 从Assets.xcassets添加新的图像集。并将其命名为“测试”

  2. 它将打印带有5张时间图像的表格视图。

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
    }

}