Deinit не вызывается, где используются блоки в swift 3.0

Я использовал блоки в ячейке для получения значения переключателя, но теперь моя проблема в том, что deinit не вызывается там, где я использовал блоки. раньше он полностью работал, но в Swift 3.0 он не работает.

Моя ячейка переключения:

import UIKit

class CellSwitch: UITableViewCell {

    @IBOutlet weak var objSwitch: UISwitch!
    @IBOutlet weak var btnInfo: UIButton!
    @IBOutlet weak var lblTitle: UILabel!
    var blockSwitch_Change : ((_ isOn:Bool) -> Void)!
    var blockBtn_Clicked : (() -> Void)!

    override func awakeFromNib() {
        super.awakeFromNib()
        self.lblTitle.font = Font.init(Font.FontType.custom(Font.FontName.NotoSans_Regular), size: Font.FontSize.standard(Font.StandardSize.Regular)).instance
        // Initialization code
    }
    //MARK:- switch object change
    @IBAction func switch_ValChanged(_ obj:UISwitch){
        self.blockSwitch_Change?(obj.isOn)
    }

    //MARK:-  button clicked
    @IBAction func btnInfo_Clicked(_ sender: UIButton) {
        self.blockBtn_Clicked?()
    }
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

Использование этой ячейки

let cell = tableView.dequeueReusableCell(withIdentifier: CellSwitch.identifier) as? CellSwitch
                cell?.lblTitle.textColor = Color.custom(hexString: objModel.titleLblColor, alpha: 1.0).value
                cell?.lblTitle.text = objModel.strTitle
                cell?.objSwitch.isOn = objModel.isOn
                cell?.btnInfo.isHidden = !objModel.isInfoBtn
                cell?.blockBtn_Clicked = { 
                   print("button clicked")
                }
                cell?.blockSwitch_Change = { (isOn) in
                    print("switch value changed \(isOn)")
                }
                if objModel.isEnable == false
                {
                    cell?.isUserInteractionEnabled = false
                    cell?.contentView.alpha = 0.5
                }
                else
                {
                    cell?.isUserInteractionEnabled = true
                    cell?.contentView.alpha = 1.0
                }
                return cell!

Также, если я прокомментирую эти два блока, будет вызван мой deinit.


person chirag shah    schedule 10.07.2018    source источник
comment
Попробуйте установить их оба как weak ссылки.   -  person Rakesha Shastri    schedule 10.07.2018
comment
Являются ли те операторы печати, которые у вас всегда есть внутри блоков, кодом, который вы фактически используете, когда видите проблему?   -  person Aidan Malone    schedule 10.07.2018
comment
@AidanMalone нет, я не могу делиться фактическим кодом, поэтому я временно помещаю оператор печати   -  person chirag shah    schedule 10.07.2018
comment
@RakeshaShastri можно ли предоставить код?   -  person chirag shah    schedule 10.07.2018
comment
Хорошо, код внутри блоков ссылается на саму ячейку?   -  person Aidan Malone    schedule 10.07.2018
comment
@AidanMalone нет, произошел какой-то расчет, тогда я сохраняю значение в модели vc   -  person chirag shah    schedule 10.07.2018
comment
Итак, возможно, вы создаете цикл сохранения с самим vc, а затем ссылаетесь на vc внутри блока. Вместо этого вам нужно будет использовать слабую ссылку, как предложил @RakeshaShastri. Я опубликую предложение кода ниже.   -  person Aidan Malone    schedule 10.07.2018
comment
Давайте продолжим обсуждение в чате.   -  person chirag shah    schedule 10.07.2018


Ответы (1)


Похоже, вы создаете цикл сохранения, строго ссылаясь на контроллер представления внутри блоков. Вместо этого вы должны создать слабую ссылку на vc для использования. Это мой предпочтительный метод

cell?.blockBtn_Clicked = { [weak self]
    print("button clicked")
    self?.viewModel.//do something
}
cell?.blockSwitch_Change = { [weak self] (isOn) in
    print("switch value changed \(isOn)")
    self?.viewModel.//do something
}

Часть [weak self] передаст в блок слабую ссылку на себя, хотя обратите внимание, что эта ссылка теперь является необязательной. Затем вы можете использовать дополнительную цепочку или развернуть ее после этого.

person Aidan Malone    schedule 10.07.2018
comment
В качестве альтернативы вы также можете использовать [unowned self]. Это также создаст слабую ссылку, но она не будет необязательной (она будет неявно развернута перед передачей в блок). Если ваш неуверенный слабый, как правило, безопаснее, поскольку он защищает от потенциального сбоя, но стоит подумать, поскольку, возможно, вы не хотите, чтобы приложение продолжало выполнение в сценарии, когда этот блок вызывается, а контроллер представления был удален из памяти. - person Aidan Malone; 10.07.2018