2017-04-25 4 views
1

, 나는 콜백 그래서, self 강하게 self.doSomething 여기에 참조메소드 클로저가 인스턴스를 신속하게 유지합니까? 신속한에서

self.someView.someCallback = self.doSomething 

에 할당 방법, 예를 들어, 폐쇄 등의 인스턴스 메서드를 사용할 수 있습니까? 위의 줄이 참조 루프를 만드나요?

+0

이 질문을 참조하십시오. http://stackoverflow.com/questions/24320347/shall-we-always-use-unowned-self-inside-closure-in-swift –

+0

@DejanSkledar : 그 대답은 없습니다 질문은 나의 것에도 적용됩니다. –

+0

@ 롭 : 내 질문에 대답하고 계시거나 단순히 반복 하시겠습니까? –

답변

1

doSomething이 인스턴스 메서드 인 self 인 경우 해당 행은 강력한 참조를 설정합니다.

doSomething이 함수가 아니고 클로저 인 경우 해당 행 자체는 강력한 참조를 설정하지 않고 클로저 자체가 self을 가리키는 지 여부와 관련된 질문이됩니다. [weak self] 또는 [unowned self] 캡처 목록이 있는지 여부에 관계없이

0

는 유지주기를하려면 각 방향에 강한 참조를 가질 필요 예 :

A가 강하게 개체 B에게

개체 B를 참조

개체 강하게 참조 객체

공유 한 코드에서 self보기 컨트롤러이고 가정하면 은보기에 대한 강력한 참조라고 말할 수 있습니다. 그 : 개체 B (일부보기) 다시보기 컨트롤러에 대한 강한 참조가있는 경우

개체 A가 (보기 컨트롤러) 강력 개체 B (일부보기)를 참조

이제, 당신은있을 것이다 주기를 유지하라. doSomething 가정

은 당신의 ViewController의 방법, 그리고 폐쇄, 당신 이 사이클이를 확인하는

하는 쉬운 방법을 유지해야합니다, 모두 당신의 에 일부보기 당신을 deinit을 구현하는 것입니다 그래서 같은 보기 컨트롤러 :

class SecondViewController: UIViewController { 

    var someView: CustomView? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     someView = CustomView(frame: view.frame) 
     someView?.someCallback = doSomething 
    } 

    func doSomething() { 
    } 

    deinit { 
     print(#function) 
    } 
} 

final class CustomView: UIView { 
    var someCallback: (() -> Void)? 

    deinit { 
     print(#function) 
    } 
} 

당신은 deinitprint의가 인쇄되지 않습니다 것을 볼 수 있습니다 콘솔에.그러나 당신이 someCallback를 할당하는 방식 변경 : 따라서 사이클을 유지 위반,

someView?.someCallback = { [weak self] in 
    self?.doSomething() 
} 

deinit 실행하게됩니다

편집 :

:

심지어, 대안으로

            
 
             
  weak var weakSelf = self someView?.someCallback = weakSelf?.doSomething 
            
 

,

(에도이 비록이 발현 someCallback의 할당이 수행 될 때 평가되고 있기 때문에, 미약 한 기준을 사용하지이 실행될 때, 이것은 여전히 ​​strong 참조 될 것이다) - 감사 @Rob

+1

좋은 점 @Rob, 내 대답이 업데이트되었습니다. – Edgar