2016-09-16 3 views
2

dismissViewControll이 호출 된 후 프로토콜 및 대리자 메서드를 사용하여 이전 VC로 데이터를 다시 전달했습니다. 아래는 가장 튜토리얼 그러나 약한 위임자 및 클래스 프로토콜

protocol someVCDelegate { 
    func somefunction() 
} 

var delegate: someVCDelegate! 

을 쓴 그 방법이 아니다 나는 그것을 일반적으로하는 방법이다, 나는 그것을 작성하는이 클래스/약한 접근을 가로 질러왔다.

protocol someVCDelegate : class { 
    func somefunction() 
} 

weak var delegate: someVCDelegate! 

약점은 ARC와 관련되어 있으며주기 유지를 피하는 것으로 알고 있습니다. 그러나, 나는 모든 경우 에서처럼 그것을 필요로 할 때 나는 확실하지 않다. 약한 대의원 작품을 찾지 않는다. (VC는 deinit을한다.) 어떤 상황에서 약한 대의원이 필요한가요? 또한 왜 "!" 약한 후 일반적으로 그것은 "?" 약한 권리 후에?

+0

언제든지 위임을하지 않으시겠습니까? 또는 이전 VC는 다음 VC에 대한 참조를 유지하지 않습니까? 객체가 적어도 하나의 강력한 참조를 가지고 있다면, ARC는 그것을 정리하지 않을 것입니다. 따라서 이전 VC에 다음 VC에 대한 참조가 있고 다음 VC에 이전에 대한 (강력한) 대리자 참조가있는 경우 ARC는 메모리 누수를 일으키는 다른 참조를 모두 잃어 버리면 삭제하지 않을 것입니다. – Fonix

+0

대리인을 만드는 것이 항상 좋은 습관입니다. 어쨌든 약한, 그것의 어렵지 않고 미래에 몇 가지 두통을 저장할 수 있습니다. 나중에 문제가된다면 디버그하기가 어려울 수 있습니다. – Fonix

+0

오늘 오늘 읽어보십시오. 그것은 나를위한 약간의 느슨한 목적을 명확히했다 : ARC. https://www.raywenderlich.com/134411/arc-memory-management-swift – Adrian

답변

2

당신 말 :

그러나, 나는 내 모든 경우로해야 할 때 확실하지 않다, 약한 위임을 수행 여부를

당신은 약한 프로토콜 위임 패턴을 필요로 작동 강력한 참조주기, 즉 강한 일련의 순환 참조에 대한 가능성이있을 때. 예를 들어, 고려 :

  • 객체 속성 (이하 "자식")를 갖는다 (이하 "부모"), 즉, 부모가 아이에게 강한 참조있다;

  • 아동은 delegate 속성을가집니다.

  • 부모 개체를 참조하도록 자녀의 delegate을 설정했습니다. 대리인이 weak 참조가 될하거나 다른 당신은 강한 참조주기를해야하는 것이이 경우에

, 그것은 중요합니다.

참고로이 예제는 간단한 예제이며 때로는 강력한 참조 체인이 다소 복잡 할 수 있습니다. 예를 들어 대리자 속성이있는 UIView 하위 클래스를 생각해보십시오. 잠재적 인 강력한 참조주기는 뷰 컨트롤러에서 루트 view까지 일련의 하위 뷰 하위 뷰를 통해 UIView까지 delegate까지 표시 컨트롤러로 다시 참조 될 수 있습니다. 이렇게하면 참조주기가 길어지고 그 이유 때문에 에 weak 참조를 사용하려고합니다.

그러나보기 컨트롤러간에 데이터를 전달하기 위해 프로토콜 위임 패턴을 사용하는 경우 제시된보기 컨트롤러가 제시된보기 컨트롤러를 소유하지 않기 때문에 일반적으로이 문제가 발생하지 않습니다 (보기 컨트롤러 포함 제외). . 뷰 컨트롤러 계층 구조는 일반적으로 뷰 컨트롤러에 대한 강력한 참조를 유지합니다. 따라서 제시된 뷰 컨트롤러를 닫을 때 할당 해제되고 잠재적 인 강력한 참조 사이클이 해결됩니다.

흔히 우리는 강한 참조주기가 전혀 발생하지 않기 때문에 본능적으로 weak 프로토콜 대리인 패턴을 사용합니다. 그러나 때때로 당신은 강력한 참고 문헌을 사용할 것입니다. 가장 일반적인 강력한 참조 패턴은 NSURLSession이며 delegate은 강력한 참조입니다. documentation for init(configuration:delegate:delegateQueue:)으로 우리를 경고 :

세션 객체는 앱이 종료 될 때까지 delegate에 강한 참조를 유지 또는 명시 적으로 세션을 무효화합니다. invalidateAndCancel() 또는 finishTasksAndInvalidate() 메서드를 호출하여 세션을 무효화하지 않으면 응용 프로그램이 종료 될 때까지 메모리 누수가 발생합니다. 이 역설적으로 보일 수도 있지만

이 강한 참조 패턴의 장점은 세션이 안전하게 할당이 해제 된 개체의 두려움없이 대리자 메서드를 호출 할 수 있습니다 것을 알고 있다는 것입니다. (우리가 종종 완료 핸들러 메서드를 사용하고 대리자 메서드를 전혀 사용하지 않기 때문에 NSURLSession의이 강력한 대리자 동작은 거의 추악한 머리를 드러내는 경우는 거의 없으며 대리 메서드를 사용하는 경우 종종 다른 개체를 사용하게됩니다. 간단히 말해 각 상황을 평가하고 우리가 본능적으로 기대하는 약한 참조가 더 나은지 또는 그 중 한 사례가 자신의 위치에 있는지 여부를 판단해야합니다. 프로토콜은 강력한 참조와 함께 제공하는 것이 좋습니다.

0

약한 참조 : 약한 참조는 참조하는 인스턴스를 강력하게 유지하지 않는 참조이므로 참조 된 인스턴스를 처리하지 못하도록 ARC를 중지하지 않습니다. 이 동작은 참조가 강력한 참조주기의 일부가되지 않도록합니다. 또는 단순히 클래스 간의 관계 중 일부를 강력한 참조가 아닌 약한 참조 또는 소유되지 않은 참조로 정의하여 강력한 참조주기를 해결할 수 있습니다.

그리고 "!" 암시 적으로 풀려 있기 때문에 약한 후에. 가치가있을거야.

때때로 프로그램의 구조에서 선택 사항은 값이 처음으로 설정된 후에 항상 값을가집니다. 이러한 경우 옵션 값이 액세스 될 때마다 항상 값을 갖고 있다고 가정 할 수 있기 때문에 옵션 값을 확인하거나 제거 할 필요성을 제거하는 것이 유용합니다.

관련 문제