반응형
클로저내에서 self를 참조할 때, self?.와 guard let self = self의 사용은 주로 강한 참조와 약한 참조, 그리고 코드 가독성과 안전성 측면에서 차이를 보입니다.
self?. 사용
someClosure = { [weak self] in
self?.doSomething()
}
self?.는 클로저 내에서 self를 약하게 참조(weak reference)할 때 사용됩니다.
self가 nil일 경우 클로저 내의 코드가 실행되지 않도록 합니다.
장점:
- 안전성: self가 nil일 경우 클로저 내의 코드가 실행되지 않아 안전합니다.
- 간결함: 짧고 간결한 코드로 작성할 수 있습니다.
단점:
- 옵셔널 처리: 모든 self 참조가 옵셔널이므로, 추가적인 옵셔널 언래핑이 필요할 수 있습니다.
- 부분 실행: self가 nil일 경우 클로저 내의 코드가 부분적으로 실행되지 않을 수 있습니다.
guard let self = self 사용
guard let self = self는 클로저 내에서 self를 강하게 참조(strong reference)할 때 사용됩니다.
self가 nil인 경우 클로저의 실행을 중지시킵니다.
someClosure = { [weak self] in
guard let self = self else { return }
self.doSomething()
}
장점:
- 강한 참조: self를 강하게 참조하여 클로저 내에서 self를 안전하게 사용할 수 있습니다.
- 명확한 흐름: self가 nil인 경우 일찍 리턴하여 코드 흐름이 명확합니다.
단점:
- 조금 더 길어짐: guard 구문으로 인해 코드가 길어질 수 있습니다.
- 메모리 관리: 강한 참조를 사용하므로, 잘못 사용하면 메모리 누수(leak)가 발생할 수 있습니다.
정리
[weak self]는 클로저를 사용할 때, strong reference로 인한
memory leak을 대처하기 위해 사용되는 코드
weak self를 사용하게 되면 self instance가 Optional이 됩니다.
따라서 nil 여부를 체크(=캡처가 되었는지)해야 하는데,
이 때 필요에 따라 guard let self = self나 self?.중 하나를 사용하면 됩니다.
반응형
'iOS > Swift' 카테고리의 다른 글
[Swift] 고차함수 (map, filter, reduce, compactMap, flatMap) (0) | 2024.07.05 |
---|---|
[Swift] 타입에러 경고 Cast from 'JSON?' to unrelated type ' ' always fails (0) | 2024.07.04 |
[Swift] 의존성 주입 Dependency Injection (0) | 2024.06.11 |
[Swift] Access Control (접근제한) (0) | 2024.05.31 |
[Swift] designated init 과 convenience init (0) | 2024.05.30 |