← 질문 목록
#100깊이 0
자동 참조 계산인데 왜 메모리가 남는가?
강한 참조 고리가 생기면 각 객체의 참조 수가 0이 되지 않기 때문이다. 외부 소유자가 놓아도 고리 안의 객체는 해제되지 않는다.
- 1. 객체 A에서 객체 B로: 강한 참조로 수를 올린다
- 2. 객체 B에서 객체 A로: 강한 참조로 수를 올린다
- 3. 소유자에서 객체 A로: 참조를 놓아도 두 객체가 남는다
소유 관계가 아닌 역참조는 weak로 끊는다. 대상이 먼저 사라지지 않는다는 수명 보장이 있을 때만 unowned를 쓴다.
클로저가 self를 강하게 캡처하고 self가 그 클로저를 보관해도 고리가 된다. 캡처 목록은 수명과 비동기 실행 시점을 따져 정한다.
deinit 로그와 메모리 그래프로 해제 여부를 확인한다. weak를 무조건 붙이면 작업 중 객체가 사라지는 다른 버그를 만들 수 있다.
추천 꼬리질문
관련 질문
- 뷰 바인딩은 왜 onDestroyView에서 비우는가?모바일뷰 바인딩의 참조 해제 문제는 자동 참조 계산 환경에서의 메모리 잔존 문제와 연결된다.
- 화면이 닫혔는데 객체가 남는 이유는?모바일둘 다 객체가 메모리에 남아서 수거되지 않는 메모리 관리 및 참조 관계 문제를 다룬다.
- 안드로이드에서 메모리 누수가 발생하는 주원인은 무엇인가?모바일메모리 누수는 참조 계산이나 가비지 컬렉션의 한계로 인해 발생하며, 두 질문 모두 메모리 회수 실패 문제를 다룹니다.
- 순환 참조 객체도 회수할 수 있는 이유는?언어 · 런타임참조 계산의 한계인 순환 참조 문제를 해결하는 GC의 메커니즘을 다룹니다.
- 참조 횟수가 0이 아닌 객체도 왜 수거되는가?언어 · 런타임참조 횟수 기반 수거의 한계와 이를 보완하는 도달 가능성 기반 수거 방식을 다룹니다.