study record
[Swift] Delegate와 Retain 여부! 본문
Retain
Retain 즉 순환참조 여부를 묻는 것이다.
retain : 메모리가 해제되지 않아서 낭비되는 현상을 의미 (Memory Leak)
Delegate
Delegate 패턴은 어떤 객체가 해야할 일을 대신 처리하도록 프로토콜을 채택하여 위임하는 것
프로토콜에서 필요한 일들을 먼저 작성한다.
tableView.delegate = self
이후 프로토콜을 채택하여 위임자(동작을 대신해줄 사람)가 누구인지 알려주면 프로토콜에 정의된 여러 메소드들을 self에서 사용하겠다는 뜻이다.
1. 프로토콜 안에 특정 기능을 할 함수들을 깡통함수로 선언
2. 프로토콜을 변수로 선언
3. vc에서 프로토콜 채택
4. 프로토콜 변수에 self로 대리자 위임.
5. 관련 업무 수행하도록 구현
Delegate의 Retain 여부!
Retain은 객체를 만들어냈을 때 즉 인스턴스화를 시켜줄 때 생긴다. 인스턴스는 클래스로부터 생성된 객체이다.
Delegate는 프로토콜을 채택하는 것이고, 프로토콜은 클래스가 아니기에 Retain 되지 않는다고 생각할 수 있다.
하지만 클래스에서 프로토콜을 채택할 때는 Class Only Protocol이라는 클래스 전용 프로토콜을 사용해야 한다.
따라서 프로토콜이 클래스 타입으로 바뀌게 된다.
Delegate는 클래스에서 채택하려면 Class Only Protocol이라는 프로토콜로 만들어주어야 하고, 이것은 클래스 타입으로 만들어지므로 Retain이 된다고 할 수 있다.
그렇기에 델리게이트 패턴을 사용할 때 delegate 앞에 weak를 선언해 줌으로써 메모리 누수를 막을 수 있다.
SomeViewController에서 granVC 인스턴스를 만들면,
GranViewController의 fomaVC 프로퍼티가 FomaViewController를 참조하고
FomaViewController의 프로퍼티 delegate는 self 로 GranViewController를 참조하게 된다.
이렇게 서로를 참조하게 되어 메모리 누수가 생길 수 있기 때문에 delegate 앞에 weak를 작성함으로써 메모리 누수를 방지한다.
참조 :
'Swift > 스위프트 정리' 카테고리의 다른 글
[Swift] Swift 메모리 관리 - ARC란? (0) | 2022.05.18 |
---|---|
[Swift] Dynamic Dispatch란? (0) | 2022.04.14 |
[Swift] 탈출 클로저(escaping closure)란? (0) | 2022.03.09 |
[Swift] 순환참조 (Retain Cycle) + (클로저 weak self) (0) | 2022.03.05 |
[Swift] static (0) | 2022.02.26 |