Использование того же объекта UIImage по умолчанию для повторного использования / инициализации ячейки - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть сомнения относительно использования UIImage по умолчанию, хранящегося в Assests.xcassets во время настройки ячейки в методе делегата tableView _cellForRowAtIndexPath_.Рассмотрим следующий фрагмент кода:

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 голосов
/ 29 декабря 2018

UIImage не является подклассом UIView и не добавляется как подпредставление вашего UIImageView.UIImageView - это UIView, который может отображать UIImage.

Поскольку UIImage является неизменным объектом, несколько UIImageViews могут безопасно ссылаться на один и тот же UIImage.

Инициализатор UIImage(named:) использует внутренний кэш в памяти, так чтовы используете одно свойство со своим изображением по умолчанию или повторно используете инициализатор UIImage(named:), не влияющий на объем памяти вашего приложения.

0 голосов
/ 29 декабря 2018

Попробуй это.

  1. Добавить новый набор изображений из Assets.xcassets.И назовите его «test»

  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
    }

}
0 голосов
/ 29 декабря 2018

Поскольку изображение является подпредставлением imageView

Нет, это не так.image - это просто свойство UIImageView типа UIImage? для изображения, отображаемого в представлении изображения ( документы ).

Теперь, если у вас есть изображение по умолчанию для ячейки, выне нужно беспокоиться о «следе памяти», и вы можете установить его внутри cellForRowAt

cell?.imageView?.image = UIImage(named: "Default") 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...