2017-04-17 74 views
2

我正在關注用於開發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不允許我一個視圖控制器來解交織 請讓我知道我做錯了什麼?

+0

你能提供一個實際的代碼嗎?我相信在這個簡化的例子中,一些細節可能被省略。 –

+0

@先生Hedgehog它是一樣的先生,但如果我從onSuccess()註釋表視圖部分內存泄漏不會發生 –

回答

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 

一切都在正確的重新分配。我想保留週期是在別的地方,很難找到基於提供的代碼。