본문 바로가기

# 02/iOS

[iOS] iOS에서 strong, weak, unowned의 차이점

반응형

iOS는 ARC(Automatic Reference Counting) 기반 메모리 관리를 사용합니다.
객체 간 참조가 순환될 경우 메모리 누수가 발생할 수 있어서,
strong, weak, unowned를 적절히 사용해 순환 참조를 방지해야 합니다.

 

  • strong은 기본 참조 방식으로, 참조 횟수를 증가시켜 객체 생존을 유지합니다. 대부분의 경우에 사용되며, 순환 참조가 없을 때 적절합니다.
  • weak은 참조는 하지만 참조 카운트를 증가시키지 않고, 객체가 해제되면 자동으로 nil이 됩니다. 주로 delegate 패턴에서 사용되며, 선언 대상이 옵셔널이어야 합니다.
  • unowned도 참조 카운트를 증가시키지 않지만, nil이 되지 않는다고 보장되는 관계에 사용합니다. 예를 들어, 클로저 내부에서 self를 캡처할 때 순환 참조를 피하기 위해 자주 사용됩니다.

 

 

 

weak, unowned 차이

✅ 핵심 차이


  weak unowned
참조 대상이 해제되었을 때 nil로 자동 설정됨 접근 시 크래시 발생
옵셔널 여부 ✅ 반드시 Optional 타입 ❌ Optional로 쓸 수 없음
사용 시점 참조 대상이 없어질 수 있음 참조 대상이 항상 살아 있다고 확신할 수 있을 때
예외 발생 없음 (nil 처리) 있음 (EXC_BAD_ACCESS 발생 가능)

 

✅ 코드 예시로 이해하기

class Owner {
    var name = "Jiyeon"
    var pet: Pet?

    deinit { print("Owner deinit") }
}

class Pet {
    // weak은 옵셔널
    weak var owner: Owner?

    deinit { print("Pet deinit") }
}

 

  • owner가 해제되면 pet.owner는 자동으로 nil
  • 안전함 ✅

 


 

class Owner {
    var name = "Jiyeon"
    var pet: Pet!

    deinit { print("Owner deinit") }
}

class Pet {
    // unowned는 옵셔널 안 됨
    unowned var owner: Owner

    deinit { print("Pet deinit") }
}

 

  • owner가 먼저 해제된 상태에서 pet.owner에 접근하면 ❌ 크래시 발생

 


 

 

✅ 정리 요약

상황추천

 

참조 대상이 먼저 해제될 수 있음 weak (안전하게 nil 처리됨)
참조 대상이 무조건 살아 있을 거라 확신 unowned (메모리 절약 가능, 단 크래시 주의)
 

 

💡 외우는 팁

"불안하면 weak, 확신 있으면 unowned"


반응형

'# 02 > iOS' 카테고리의 다른 글

[iOS] iOS GCD 핵심 요약  (0) 2025.05.15
[iOS] GCD란?  (0) 2025.05.15
[iOS] Xcode Instruments  (0) 2025.05.15
[iOS] Tuist  (0) 2025.05.14
[iOS] Geofence  (0) 2023.09.22