2017-05-18 6 views
0

클로저와 HTTP 요청에 [weak self]를 사용할 필요가 있는지에 관한 질문이 있습니다. HTTP 요청에 [weak self] 사용하기

func saveBla() { 
    blaManager.saveBla(bla) { error in 
     self.pay5euro() 
    } 
} 

내 질문

은 다음과 같습니다 : 여기 여부 약한 참조를 사용해야합니까

는 예를 들어 우리는 완료에 폐쇄를 트리거하는 HTTP 요청이? 우선, 다른 페이지로 이동 한 후 API 호출의 응답을 잃고 싶지 않습니다. 그 외에 메모리 누수가있는 유지주기를 만들지 않으시겠습니까?

func saveBla() { 
    blaManager.saveBla(bla) { [weak self] error in 
     guard let strongSelf = self else { return } 
     strongSelf.pay5euro() 
    } 
} 

이 상황에서 [약한 자기]를 사용해야 할 필요가 있습니까?

답변

1

관리자와 컨트롤러의 관계에 따라 다릅니다.

Conslusion : 소유 한 B와 B가 약한 참조없이 A를 소유하면주기가 유지됩니다. 당신이처럼 행동 관리하는 경우

class NetManager { 
    func fire(completion: (_ result: Bool) -> Void) { 
     completion(true) 
    } 
} 


class controler: UIViewController { 
    override func viewDidLoad() { 
     let manager = NetManager() 
     // In this case the Manager and Controller NOT own each other, 
     // And the block will release after request finished, it is ok to not use weak. 
     manager.fire { (result) in 

     } 
    } 


    let manager = NetManager() 
    func anOtherExample() { 
     // In this case the controller own the manager, 
     // manager own the controller, but manager will relase the controller after 
     // request finished, this will cause a delay to controller's relase, but it is still ok. 
     manager.fire { (result) in 

     } 
    } 
} 

후 관리자는 컨트롤러를 소유하고 컨트롤러가 매니저를 소유 할 때주기를 유지하게됩니다.

class NetManager { 

    var completion: ((_ result: Bool) -> Void)? 

    func fire(completion: @escaping (_ result: Bool) -> Void) { 
     self.completion = completion 
    } 
} 

자세한 내용 :

+0

https://krakendev.io/blog/weak-and-unowned-references-in-swift 그래서 클로저를 사용할 때 사이클을 유지하는 데 가장 중요한 이유는, 때 관리자 것 '저장'속성에서 화재 함수 외부 완료 핸들러? 제 경우에는 항상 그를 특정 기능 안에 넣어 두었습니다. 그래서 그는 항상 풀려날 것입니다. (어느 시점에서) –

+1

@RPelzer 예, 기능 완료 후 해제됩니다. – BrikerMan