表视图deinit没有调用

时间:2017-12-10 15:44:45

标签: ios swift3 deinit

我在一个全新的项目中有一个正常的table view,没有额外的代码。在我的故事板中,我有2个视图控制器,navigation controller嵌入到First Controller。在First Controller我有一个带按钮和标签的表格视图。我已将segue celldeinit按钮发送到故事板中的第二个控制器。

我想知道的是,当controller首先被segue调用时,它就不会被调用。我设定了突破点,似乎没有任何工作。

当我secondfirst返回second controller时,它适用于controller,因为poppeddeinit。但是在第一个控制器中运行pop需要做些什么呢?我是否还需controller stack来自nil?或者我是否需要在其他地方明确指定import UIKit class ViewController: UIViewController { // CELL DATA ARRAY var data = [0,0,0,0,0,0,0,0,0,0] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // INITIALIZE total tap ARRAY WITH INDEX 0 } deinit { print("Deleted") } } // TABLE VIEW METHODS extension ViewController:UITableViewDelegate,UITableViewDataSource{ // NUMBER OF ROWS func numberOfSections(in tableView: UITableView) -> Int { return 1 } // number of sections func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return data.count } // Cell for row func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // deque cell let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomCell cell.customLabel.text = "Total taps : \(String(data[indexPath.row]))" // CALL BACK BUTTON return cell } }

请帮我理解背后的正确概念?请引导我指出正确的方向。

代码 - :

import UIKit

class CustomCell: UITableViewCell {

    // Outlets

    @IBOutlet weak var customCount: UIButton!
    @IBOutlet weak var customLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    // Cell button action

    @IBAction func countTaps(_ sender: UIButton) {

    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

自定义单元格 - :

import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

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


    deinit {
        print("denit")
    }
}

第二控制器 - :

IRandomAccessStreem

1 个答案:

答案 0 :(得分:3)

当您使用push / present视图控制器时,第一个视图控制器不会被释放,您将看不到deinit被调用。视图控制器所需的内存量可以忽略不计,但是在内存中处于相同状态的好处是很重要的(例如,在您的示例中,如果您关闭第二个视图控制器以返回到表中)视图控制器,它确保它仍然滚动到以前完全相同的位置。

实际上,系统维护了所有已呈现的视图控制器的层次结构,但尚未弹出/关闭。请参阅View Controller Hierarchy