Swift | 약한참조와 옵셔널

일어나 개발해야지·2023년 12월 12일

Swift

목록 보기
2/21
post-thumbnail

클로져 코드를 보던 중 생긴 의문

[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)을 자주 갑니다.")
        }
    }
    
 }
    

Error

[weak self] 키워드를 추가한 순간 옵셔널로 변경하라는 에러가 발생한다.
고분고분 ?만 달아주면 끝날 문제이지만, 왜 때문인지 알아야겠다..
내가 찾은 답은 아래와 같다.

Answer

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

따라서 약한 참조로 처리하게 되면 인스턴스의 self를 옵셔널로 변경해줘야한다.

0개의 댓글