2017-04-17 2 views
2

iOS 앱을 개발할 때 MVP 아키텍처를 따르고 있습니다. onViewDidLoad()에서 일부 데이터를 반환하는 웹 서비스를 호출하고 해당 데이터를 테이블 뷰로 표시하는 앱이 상당히 간단합니다.델리게이트 메소드의 메모리 누수

의 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 

을 그리고 모든 것이 제대로 할당 해제됩니다. 보관주기는 다른 곳에서 제공되는 코드를 기반으로 찾기가 어렵습니다.