iOS/Xcode
[ Xcode ] 메모리 누수 혹은 클로저 강한 참조로 인한 Retain Cycle 발생 여부 확인 및 해소
Sheep1sik
2025. 5. 19. 13:28
반응형
1. Debug Memory Gragh
사용을 위한 기본적인 세팅
Malloc Scribble
- 메모리가 해제될 때, 해당 영역에 **특정 패턴(0xAA)**을 써서 마킹
- 이 상태에서 해제된 메모리에 접근하려고 하면, 이상한 값에 접근하게 되어 빠르게 오류를 잡을 수 있다.
Malloc Stack Logging
- 메모리가 할당될 때마다, 그 시점의 Call Stack을 저장.
- Instruments (Allocations)와 함께 사용하면, 누수 객체가 어디서 생성됐는지 추적 가능.
분석 결과
해당 사진과 같이 오류 내역이 없고 메모리 누수나 에러를 발생하고 있지 않는다.
추가적으로 모델과 컨트롤러에 아래 코드를 추가하여 호출 여부를 확인해주었다.
deinit {
print("deinitialized")
}
2. Xcode Instruments
1. Allocations – 메모리 할당 추적기
- 앱이 실행 중에 얼마나 많은 객체를 메모리에 올렸는지
- 그 객체들이 해제되고 있는지
- 메모리 사용량이 **점점 증가(누수)**하는지, 안정적으로 유지되는지를 확인할 수 있습니다.
분석 결과
- 앱 시작 후 메모리 사용량 상승한 뒤, 안정적으로 유지
- 급격한 증가나 지속적인 누적 없이 자연스러운 패턴
- 의심스러운 메모리 누수는 발견되지 않음
2. Leaks – 메모리 누수 탐지기
- 앱 내에서 할당된 객체가 해제되지 않고 남아 있는지를 확인합니다.
- Instruments가 주기적으로 Leak Check를 수행하고, 문제가 있으면 경고를 띄워줍니다.
분석 결과
- 6회 이상의 Leak Check 결과, **모두 초록색 체크(✔️)**로 통과
- 누수 객체는 단 하나도 감지되지 않음
3. Time Profiler – CPU 성능 분석기
- 앱이 실행되는 동안 CPU가 어떤 작업에 얼마만큼 자원을 사용하는지 추적합니다.
- 특정 View나 로직에서 CPU를 과도하게 쓰는지 확인할 수 있습니다.
분석 결과
- CPU 사용량이 여러 코어에 걸쳐 일정하고 분산된 형태
- 특정 구간에서 순간적인 스파이크는 있으나, 지속적으로 높게 유지되는 구간은 없음
- 무한 루프나 과도한 연산, Block UI 등의 의심 요소 없음
3. Zombie Objects
사용을 위한 기본적인 세팅
해제(dealloc)된 객체를 메모리에서 완전히 지우지 않고 "좀비(zombie)"로 남겨서,
잘못 접근 시 크래시와 함께 어떤 클래스였는지 알려주는 디버깅 기능
분석 결과
- 크래시가 나는 부분이 없어 에러가 뜨지 않음
- 추후 에러가 뜰 시 어떤 방식으로 나오는지 확인 필요
반응형