반응형
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 |