从内存中释放内存的表视图单元格问题

问题描述 投票:0回答:2

我知道我的问题很简单,我知道有关该主题的很多问题,但我找不到任何解决方案。

我有简单的表格视图,只有 100 行的标签。当我滚动时,每次使用 Xcode 中的仪器工具滚动时,内存都会增加,尽管我使用出列单元格作为苹果文档,但我的问题是为什么每次滚动时单元格不从内存中释放(从内存中释放),它正在创建新的单元格。

以下是我的代码:

import UIKit

class ViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate{

    @IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 100
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = "Table View Cell! "

        return cell

    }


}

您可以查看仪器工具,每次滚动都可以看到内存在增加。

请问,当我滚动时如何从内存中释放单元格?

非常感谢。

uitableview swift3 tableview
2个回答
2
投票

您只需从视图控制器的表视图单元格中释放内存

单击“返回”时

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if self.isMovingFromParent {
        AllProductList.removeAll() 
        self.view = nil
    }
}

deinit {
    print("deinit called")
}
  1. 删除所有数组数据模型
  2. 删除父视图

0
投票

View Controller 通过私有属性

_externalObjectsTableForViewLoading
对自身的引用表示强引用循环。此行为是由使用 Storyboard 引起的。

在下面的代码中,创建了一个带有 UIStackView 的控制器,其中添加了一个 UIView,并以控制器本身作为委托(强引用)。

class RootViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        let storyboard = UIStoryboard(name: "MyStoryboard", bundle: .main)
        let viewController = storyboard.instantiateViewController(identifier: "MyViewController")
        self.present(viewController, animated: true, completion: nil)
    }
}

protocol MySubviewDelegate {}

class MySubview: UIView {
    let delegate: MySubviewDelegate
    init(delegate: MySubviewDelegate) {
        self.delegate = delegate
        super.init(frame: .zero)
    }
}

class MyViewController: UIViewController, MySubviewDelegate {
    @IBOutlet weak var stackView: UIStackView!
    override func viewDidLoad() {
        super.viewDidLoad()
        let subview = MySubview(delegate: self)
        stackView.addArrangedSubview(subview)
    }
}

本例中的内存图如下所示 enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.