티스토리 뷰
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
- MVVM
- rxswift
- CloneCoding
- Protocol
- WidgetKit
- YPImagePicker
- Algorithm
- Notification
- Widget
- UserDefaults
- Swift
- 2022 KAKAO TECH INTERNSHIP
- Objective-C
- containerBackground
- RxCocoa
- github
- configurable widget
- WWDC
- MOYA
- OpenSourceLibrary
- Firebase
- IOS
- APNS
- urlsession
- watchOS
- SwiftUI
- 서버통신
- async/await
- WWDC22
- projectsetting
최근에 올라온 글
최근에 달린 댓글
글 보관함
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
링크
- Total
- Today
- Yesterday