2017-04-17 5 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() 

     } 

} 

私のViewControllerが は私に知らせてくださいdeintすることはできませんMyDelegateのこのonSucces何私が間違っているの?

+0

実際のコードを提供できますか?この簡単な例では、いくつかの詳細が省略されている可能性があります。 –

+0

@ Mr.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 

そして、すべてが正常に割り当て解除されます。私は保持サイクルがどこか他の場所にあり、提供されたコードに基づいて見つけるのは難しいと思います。

関連する問題