Delegate

Delegation 은 클래스 또는 구조체가 책임의 일부를 다른 유형의 인스턴스에 넘겨주거나 위임 할 수 있도록 하는 디자인 패턴이다. 이 디자인 패턴은 위임된 기능을 제공하기 위해 준수 형식(대리자라고 함)이 보장되도록 위임된 책임을 캡슐화하는 프로토콜을 정의하여 구현된다.

retain

protocol SomeDelegate {
    func something()
}
class SomeClass {
    var delegate: SomeDelegate?
}

var some1: SomeClass? = SomeClass()
var some2: SomeClass? = SomeClass()

some1.delegate = some2
some2.delegate = some1

some1 = nil
some2 = nil

위의 코드와 같은 경우에는 retain cycle이 발생한다. 왜냐하면 SomeClassdelegatestrong으로 선언되어 있는데, 이렇게 강한 참조를 하면 상위 객체의 nil을 할당해도 메모리에서 해제되지 않는다.

class SomeClass {
    weak var delegate: SomeDelegate?
}

var some1: SomeClass? = SomeClass()
var some2: SomeClass? = SomeClass()

some1.delegate = some2
some2.delegate = some1

some1 = nil
some2 = nil

두번째 코드처럼 delegateweak 키워드를 포함하여 선언하면, 상위 객체에 nil을 할당할 때 메모리에서 같이 해제된다.

참고 자료