728x90
델리게이트 사용하기 위해 프로토콜을 선언하고 있었는데 Class Delegate Protocol Violation 경고가 나타났습니다. ( swiftLint 적용중입니다.)
Delegate 로 설계된 protocol이 클래스 전용으로 선언되지 않았기 때문입니다..
Delegate는 일반적으로 사용하는 쪽에서 옵셔널 타입으로 선언합니다. 그 이유는 약한 참조로 선언해야 delegate가 메모리에서 해제될 때 더 이상 호출되지 않도록 할 수 있기 때문입니다. 서로가 강한 참조를 갖고 있다면 retain cycle이 발생될 수 있습니다. 이렇게 될 경우 한쪽에서만 해제가 된다해도 다른쪽에서 참조를 하고 있기 때문에 메모리에 계속해서 불필요한 인스턴스가 할당되어 있습니다. 이는 memory leak를 발생시킵니다.
다시 돌아와서,, 프로토콜은 클래스가 아닌 구조체에서도 선언될 수 있습니다. 클래스가 아닌곳에서 이 프로토콜이 준수될 경우 약한 참조가 지원되지 않을 수 있기에 클래스 전용으로 프로토콜을 제한해야 합니다.
근데 더이상 class 전용으로 프로토콜을 제약하는 것이 권장되지 않다고 나와있습니다. 그래서 어느 class 타입이든 준수할 수 있는 AnyObject를 사용하면 됩니다.
728x90
'Swift > Deep dive!!' 카테고리의 다른 글
[Swift] CoW(Copy-On-Write) 기법과 String은 값타입일까? 참조타입일까? (0) | 2023.07.09 |
---|---|
[Swift] private(set) var vs computed property | Read-Only 프로퍼티는 왜 사용할까? (0) | 2023.07.07 |
[Swift] 스위프트로 백준 편하게 시작하기 | 코딩테스트 준비 | readLine() | split(separator:) | map() 탐구 (0) | 2023.04.22 |
[Swift] where keyword. 언제 사용할 수 있는지 탐구하기!! (0) | 2023.02.16 |