본문 바로가기
iOS/Swift

[Swift] self?. vs guard let self = self

by 최지철 2024. 7. 3.
728x90
반응형

클로저내에서 self를 참조할 때, self?.와 guard let self = self의 사용은 주로 강한 참조와 약한 참조, 그리고 코드 가독성과 안전성 측면에서 차이를 보입니다.

 

self?. 사용

someClosure = { [weak self] in
    self?.doSomething()
}

self?.는 클로저 내에서 self를 약하게 참조(weak reference)할 때 사용됩니다.
self가 nil일 경우 클로저 내의 코드가 실행되지 않도록 합니다.

장점:

  1. 안전성: self가 nil일 경우 클로저 내의 코드가 실행되지 않아 안전합니다.
  2. 간결함: 짧고 간결한 코드로 작성할 수 있습니다.

단점:

  1. 옵셔널 처리: 모든 self 참조가 옵셔널이므로, 추가적인 옵셔널 언래핑이 필요할 수 있습니다.
  2. 부분 실행: 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()
}

장점:

  1. 강한 참조: self를 강하게 참조하여 클로저 내에서 self를 안전하게 사용할 수 있습니다.
  2. 명확한 흐름: self가 nil인 경우 일찍 리턴하여 코드 흐름이 명확합니다.

단점:

  1. 조금 더 길어짐: guard 구문으로 인해 코드가 길어질 수 있습니다.
  2. 메모리 관리: 강한 참조를 사용하므로, 잘못 사용하면 메모리 누수(leak)가 발생할 수 있습니다.

정리

[weak self]는 클로저를 사용할 때, strong reference로 인한

memory leak을 대처하기 위해 사용되는 코드

 

weak self를 사용하게 되면 self instance가 Optional이 됩니다.

따라서 nil 여부를 체크(=캡처가 되었는지)해야 하는데,

이 때 필요에 따라 guard let self = self나 self?.중 하나를 사용하면 됩니다.

728x90
반응형