iOS/Swift
[Swift] iOS는 메모리를 어떻게 관리 할까?
kimsangjunzzang
2025. 7. 21. 00:13
안녕하세요, 루피입니다.
오늘은 iOS는 어떻게 메모리를 관리할까? 라는 주제로 글을 작성 해보겠습니다. 지난 글 중 ARC와 관련된 글도 참고해서 보시면 좋을거 같습니다. 바로 시작합니다.
1. iOS 메모리 관리의 특징
iOS의 메모리 관리는 모바일 환경의 제약을 고려하여 설계되었습니다.
- 배터리 수명 최적화: 디스크 I/O를 최소화하여 전력 소모를 줄임
- 플래시 메모리 보호: 과도한 쓰기 작업으로 인한 스토리지 수명 단축 방지
- 사용자 경험 우선: 앱 응답성을 해치지 않는 선에서 메모리 관리
2. ARC (Automatic Reference Counting)
iOS 개발자가 C언어처럼 malloc과 free를 직접 호출하지 않아도 되는 이유입니다.
1) ARC의 동작 원리
ARC는 컴파일 타임에 코드를 분석하여, 객체를 언제 메모리에 올리고 언제 해제해야 할지에 대한 코드를 자동으로 삽입해 줍니다.
class MyClass {
var name: String init(name: String) {
self.name = name
}
deinit { print("메모리에서 해제됨!") }
}
var ref1: MyClass? = MyClass(name: "루피") // 참조 카운트: 1
var ref2 = ref1 // 참조 카운트: 2
ref1 = nil // 참조 카운트: 1
ref2 = nil // 참조 카운트: 0, 이 시점에 deinit 호출!
2) ARC vs 가비지 컬렉션 (GC)
| 구분 | ARC | 가비지 컬렉션 (GC) |
|---|---|---|
| 동작 시점 | 컴파일 타임 | 런타임 |
| 성능 예측 | 예측 가능 | GC 실행 시 일시 정지 |
| 메모리 해제 | 참조 카운트가 0이 되는 즉시 | GC 실행 주기에 따라 지연 |
| 개발자 제어 | 참조 관계 설계로 제어 가능 | GC 알고리즘에 의존 |
ARC는 힙 영역의 객체 수명만 관리하며, 운영체제의 가상 메모리나 페이지 교체와는 별개의 메커니즘입니다.
3. 메모리 압축
iOS는 디스크 스왑을 최소화하는 전략을 사용합니다. 디스크 스왑을 진행하기 이전에 메모리 압축을 우선적으로 진행합니다.
1) 메모리 압축의 동작 과정
- 메모리 부족 감지: 시스템이 메모리 압박 상황을 감지합니다.
- 압축 대상 선택: 당장 사용하지 않는 비활성 페이지(Inactive Pages)를 선별합니다.
- 실시간 압축: 선별된 페이지들을 압축하여 더 작은 공간에 저장합니다.
- 공간 확보: 압축으로 확보된 공간에 새로운 데이터를 올립니다.
- 압축 해제: 필요할 때 압축된 페이지를 즉시 복원합니다.
2) 메모리 압축의 장점
- 빠른 속도: 디스크 I/O보다 훨씬 빠른 압축/해제
- 배터리 절약: 디스크 접근 최소화로 전력 소모 감소
- 사용자 경험: 앱 전환이나 재시작 없이 원활한 멀티태스킹
4. iOS 메모리 경고 시스템
1) 메모리 경고의 단계적 처리
- 시스템 감지: 메모리 사용량이 임계치에 도달
- 앱에 경고:
didReceiveMemoryWarning호출 - 백그라운드 앱 정리: 사용하지 않는 백그라운드 앱의 메모리 해제
- 강제 종료: 마지막 수단으로 앱 강제 종료
2) 메모리 경고 대응 코드 예시
// UIViewController에서 메모리 경고 처리
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// 캐시 데이터 정리
ImageCache.shared.clearCache()
// 화면에 보이지 않는 뷰의 리소스 해제
if !view.window?.isKeyWindow ?? false {
heavyResourceView?.removeFromSuperview()
heavyResourceView = nil
}
print("메모리 경고 처리 완료")
}
// 앱 생명주기를 활용한 예방적 관리
func applicationDidEnterBackground(_ application: UIApplication) {
// 백그라운드 진입 시 불필요한 리소스 해제
URLCache.shared.removeAllCachedResponses()
NotificationCenter.default.removeObserver(self)
}
5. iOS와 일반 OS의 메모리 관리 비교
| 구분 | 일반적인 OS (Linux/Windows) | iOS |
|---|---|---|
| 힙 메모리 관리 | 수동 관리 (malloc/free) 또는 런타임 GC | ARC (컴파일 타임 자동 관리) |
| 메모리 압박 대응 | 디스크 스왑 적극 활용 | 메모리 압축 우선, 스왑 최소화 |
| 메모리 경고 | 시스템 레벨에서 주로 처리 | 앱에 직접 경고 신호 전송 |
| 백그라운드 처리 | 비교적 자유로운 메모리 사용 | 엄격한 메모리 사용량 제한 |
| 페이지 크기 | 주로 4KB | 16KB (ARM64 기기) |
오늘도 화이팅입니다!