, 나는 콜백 그래서, self
강하게 self.doSomething
여기에 참조메소드 클로저가 인스턴스를 신속하게 유지합니까? 신속한에서
self.someView.someCallback = self.doSomething
에 할당 방법, 예를 들어, 폐쇄 등의 인스턴스 메서드를 사용할 수 있습니까? 위의 줄이 참조 루프를 만드나요?
, 나는 콜백 그래서, self
강하게 self.doSomething
여기에 참조메소드 클로저가 인스턴스를 신속하게 유지합니까? 신속한에서
self.someView.someCallback = self.doSomething
에 할당 방법, 예를 들어, 폐쇄 등의 인스턴스 메서드를 사용할 수 있습니까? 위의 줄이 참조 루프를 만드나요?
doSomething
이 인스턴스 메서드 인 self
인 경우 해당 행은 강력한 참조를 설정합니다.
doSomething
이 함수가 아니고 클로저 인 경우 해당 행 자체는 강력한 참조를 설정하지 않고 클로저 자체가 self
을 가리키는 지 여부와 관련된 질문이됩니다. [weak self]
또는 [unowned self]
캡처 목록이 있는지 여부에 관계없이
는 유지주기를하려면 각 방향에 강한 참조를 가질 필요 예 :
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)
}
}
당신은 deinit
에 print
의가 인쇄되지 않습니다 것을 볼 수 있습니다 콘솔에.그러나 당신이 someCallback
를 할당하는 방식 변경 : 따라서 사이클을 유지 위반,
someView?.someCallback = { [weak self] in
self?.doSomething()
}
이 deinit
실행하게됩니다
편집 :
:
심지어, 대안으로
weak var weakSelf = self someView?.someCallback = weakSelf?.doSomething
(에도이 비록이 발현 someCallback
의 할당이 수행 될 때 평가되고 있기 때문에, 미약 한 기준을 사용하지이 실행될 때, 이것은 여전히 strong
참조 될 것이다) - 감사 @Rob
좋은 점 @Rob, 내 대답이 업데이트되었습니다. – Edgar
이 질문을 참조하십시오. http://stackoverflow.com/questions/24320347/shall-we-always-use-unowned-self-inside-closure-in-swift –
@DejanSkledar : 그 대답은 없습니다 질문은 나의 것에도 적용됩니다. –
@ 롭 : 내 질문에 대답하고 계시거나 단순히 반복 하시겠습니까? –