클로져 코드를 보던 중 생긴 의문
[weak self] 약한참조로 처리하게 되면
왜 옵셔널로 변경해야하는걸까?
class Cafe {
let name = "별다방"
func regularCafe() {
print("나는 \(name)을 자주 갑니다.")
}
// 클로저로 인한 강한 참조 발생 중
func regularCafe1() {
DispatchQueue.global().async {
print("나는 \(self.name)을 자주 갑니다.")
}
}
//약한 참조를 사용하고 있으므로 참조 카운팅이 발생되지 않는 상황
// self가 옵셔널로 변경됨 [WHY?]
func regularCafe2() {
DispatchQueue.global().async { [weak self] in
print("나는 \(self?.name)을 자주 갑니다.")
}
}
//[또 다른 표현법]
func regularCafe3(){
DispatchQueue.global().async { [weak self] in
guard let weakSelf = self else { return }
print("나는 \(weakSelf.name)을 자주 갑니다.")
}
}
}
[weak self] 키워드를 추가한 순간 옵셔널로 변경하라는 에러가 발생한다.
고분고분 ?만 달아주면 끝날 문제이지만, 왜 때문인지 알아야겠다..
내가 찾은 답은 아래와 같다.

Answer
① 약한 참조로 바꾼다는 건, 참조 카운팅이 일어나지 않는다는 걸 의미,
② 때문에 호출되는 시점에 Person class가 할당이 해제 되어있을 수 있다.
③ Error 메세지의 "must be unwrapped" 래핑을 풀어야한다
④ 옵셔널로 처리함으로 언래핑 할 수 있다따라서 약한 참조로 처리하게 되면 인스턴스의 self를 옵셔널로 변경해줘야한다.