THIS IS ELLIE

Protocol에 class선언해주기 본문

개발/iOS

Protocol에 class선언해주기

Ellie Kim 2019. 2. 5. 20:49

Q delegate는 왜 Weak로 선언할까요?

Retain cycle 을 피하기 위해서!


기본적으로 클래스의 객체를 가리키는 각각의 reference는 강함 참조(strong)입니다.

두 클래스 인스턴스가 서로 강한 참조를 하게 되면 그것이 Retain Cycle이 됩니다. 

서로 강한 참조를 하고 있으면 사용하지 않는데도 deinit 되지 않습니다. 


만약에 객체에 대한 강한 참조가 존재하지 않는다면 메모리에서 자동으로 해제됩니다.

weak로 선언한다면 강한 참조가 되지 않아 객체의 메모리가 해제되면 자동으로 nil이 될 것입니다. 


Retain Cycle은 delegate에서는 흔하게 발생합니다. 

그래서 delegate를 사용할 땐 대부분의 상황에 weak로 선언합니다.

UITableViewDelegate도 weak로 선언되어 있는 걸 확인할 수 있습니다.


Protocol에 class선언해주기


진행하고 있는 프로젝트에서 A가 한 일을 B가 대신 처리하도록 하기 위해 delegate 패턴을 사용했습니다.

먼저 protocol을 선언했습니다. 

이렇게 사용하면 어떻게 될까요?

에러가 발생합니다.

에러 내용은 Class Delegate Protocol Violation 

Delegate protocols should be class-only so they can be weakly referenced. 

위임 프로토콜은 약한 참조 될 수 있도록 클래스 전용이어야 합니다.

무슨말이지 ㅋㅋㅋㅋ

이 상태에서 weak을 쓴다고 하면 에러를 발생시킵니다.

weak must not be applied to non-class-bound -- 

왜 에러를 발생시키는 걸까요?

해당 타입이 클래스인지 구조체인지 알 수 없기 때문에 unowned와 weak를 사용할 수 없게 됩니다.

그래서 프로토콜 옆에 class 전용이라고 써줍니다.

따라서 클래스 타입인 경우 메모리 누수가 발생할 수도 있으니 weak를 사용할 수 있습니다.

따라서 class라고 선언해줘야지만 unowned와 weak를 사용할 수 있습니다. 

아무런 에러를 발생시키지 않습니다.


반응형

'개발 > iOS' 카테고리의 다른 글

iOS Application lifecycle  (0) 2019.04.05
iOS 뷰 컨트롤러 생명주기  (0) 2019.04.04
iOS AnimationOptions  (0) 2019.01.16
iOS CGAffineTransform 사용하기  (8) 2019.01.13
iOS UIView animate 사용하기  (0) 2019.01.12