委托方法中的内存泄漏

时间:2017-04-17 11:12:16

标签: ios swift3 delegates mvp

我正在关注开发iOS应用程序的MVP架构。应用程序非常简单,其中onViewDidLoad()我称之为Web服务,它返回一些数据并在表格视图中显示该数据。

的ViewController:

class A : UIViewController{

var presenter : MyPresenter?

  override func viewDidLoad() {
     presenter = MyPresenter(delegate:self)
     presenter.callWS()
  }

}
extension A : Mydelegate{

   func onSuccess(){

       //this doesnt allow my viewcontroller to deint
       tablview.delegate=self
       tableview.datasource=self
       tableview.reloadData()
}

}

protocol MyDelegate : class{

func onSuccess()

}

class MYPresenter {

 weak var delegate : MyDelegate?

    init(MyDelegate) {
        self.delegate=delegate
    }

    func callWS(){

       delegate.onSuccess()

       }

}

MyDelegate的onSucces不允许我的A viewcontroller deint 请让我知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

我稍微修改了您的代码版本并在游乐场中运行:

import UIKit
import PlaygroundSupport

class A : UITableViewController {

    var presenter : MyPresenter?

    override func viewDidLoad() {
        presenter = MyPresenter(delegate:self)
        presenter?.callWS()

        let gesture = UITapGestureRecognizer(target: self, action: #selector(dismissOnTap))
        view.addGestureRecognizer(gesture)
    }

    func dismissOnTap() {
        dismiss(animated: true)
    }

    deinit {
        print("Bye VC")
    }
}

extension A : MyDelegate {

    func onSuccess(){

        //this doesnt allow my viewcontroller to deint
        tableView.delegate = self
        tableView.dataSource = self
        tableView.reloadData()
    }

}

protocol MyDelegate : class {

    func onSuccess()

}

class MyPresenter {

    weak var delegate : MyDelegate?

    init(delegate: MyDelegate) {
        self.delegate = delegate
    }

    func callWS() {
        delegate?.onSuccess()
    }

    deinit {
        print("Bye")
    }

}

class B: UIViewController {

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)
        let gesture = UITapGestureRecognizer(target: self, action: #selector(showOnTap))
        view.addGestureRecognizer(gesture)
    }

    func showOnTap() {
        let vc = A(style: .plain)
        present(vc, animated: true)
    }

}

let b = B()
b.view.frame = CGRect(x: 0, y: 0, width: 400, height: 600)
PlaygroundPage.current.liveView = b.view

一切都正常解除分配。我想保留周期在其他地方,根据提供的代码很难找到。