티스토리 뷰

728x90
반응형

Delegate 패턴을 사용하면서 Protocol 을 만들었다. 그런데 SwiftLint 에서 다음과 같이 경고가 발생했다!

delegate 는 reference cycle 을 피하기 위해서 weak(약한 참조)를 사용해야 한다.

delegate protocol 은 weak(약한 참조)를 위해서 클래스 전용 이어야 한다.

Delegate 를 weak 로 선언하자

인스턴스화 해서 참조할 때 Retain 이 생긴다고 해요. 그런데 protocol 은 클래스나 구조체처럼 인스턴스화 되는 것이 아닌데 왜 Retain cycle 이 생기는걸까요?

예를 들어 클래스 a와 b가 서로를 protocol 로 참조하게 되면 강한 참조가 되면서 Retain Cycle 이 발생하는거죠!

그래서 weak 를 선언해서 reference count 를 늘리지 않도록 해주는 것이 메무리 누수를 막을 수 있는 방법이랍니다.

그래서 프로토콜을 weak 로 약한 참조로 선언을 해주었더니 이제는 에러가 발생했다...?

weak 를 사용하려는 타입이 만약 protocol 일 경우 class 를 상속받지 않으면 위의 오류를 발생시켰습니다.

이게무슨.. ㅎ.. 자자.. 진정하고

우리가 프로토콜을 채택하는 해당 타입이 클래스인지 구조체인지 열거형인지 알 수 없습니다. 그래서 reference count 관리를 위한 weak 를 사용할 수 없기 때문에 나타나는 오류입니다.

그래서 프로토콜은 class 를 상속받아서 class 에만 사용할 프로토콜임을 알려줘야 합니다.

class 가 곧 사용되지 않는다고 AnyObjcet 를 대신 사용하라고 해서 아래와 같이 코드를 수정해주었습니당.

  • AnyObject : 모든 class type의 instance 나타낼 수 있음.(즉, 클래스 타입만 저장할 수 있다.)

출처 :

Protocol에 class선언해주기

[swift] 메모리 관리 - Retain Cycle : strong, weak, unowned

[iOS 면접질문] Delegate는 retain이 될까?

728x90
반응형

'iOS' 카테고리의 다른 글

Swift) 삼항연산자  (4) 2021.11.24
iOS) PHPicker iOS 14+  (0) 2021.11.15
iOS) Alert 창 만드는 커스텀 메서드 분석하기  (0) 2021.11.10
iOS) Xib 로 만든 커스텀뷰에서 액션 연결  (0) 2021.11.06
iOS) Dynamic Type  (2) 2021.11.05
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
링크
Total
Today
Yesterday