티스토리 뷰
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 나타낼 수 있음.(즉, 클래스 타입만 저장할 수 있다.)
출처 :
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 |
댓글
TAG
- configurable widget
- Swift
- Notification
- SwiftUI
- APNS
- github
- 2022 KAKAO TECH INTERNSHIP
- urlsession
- MOYA
- 서버통신
- Firebase
- MVVM
- YPImagePicker
- RxCocoa
- containerBackground
- WidgetKit
- IOS
- Algorithm
- WWDC
- async/await
- projectsetting
- OpenSourceLibrary
- Widget
- CloneCoding
- Protocol
- UserDefaults
- watchOS
- WWDC22
- Objective-C
- rxswift
최근에 올라온 글
최근에 달린 댓글
글 보관함
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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