Table of Contents
이 문서는 iOS 애플리케이션을 위한 다양한 기능을 제공합니다. 이 문서는 iOS 애플리케이션을 위한 가장 중요한 요소입니다. 이 문서는 Apple의 자동 참조 카운트링(ARC)를 통해 앱 응답성, 배터리 수명 및 전체 사용자 만족도에 직접 영향을 미칩니다. Apple의 자동 참조 카운트링(ARC)가 무거운 리프팅을 자동화하는 동안 개발자는 여전히 누출을 방지하기 위해 deliberate 전략을 채택해야 하며, 피크 메모리 발자국을 줄이고 시스템 압력에 유착하게 반응합니다. 이 문서는 iOS 앱을 위한 메모리 최적화에 대한 포괄적이고 생산적 가이드를 제공합니다.
iOS 메모리 관리 이해
iOS는 개체의 수명주기를 관리하기 위해 자동 참조 계산 (ARC)을 사용합니다. ARC는 자동으로 ] 및 ] 컴파일 시간에 호출하여, 참조가 0으로 떨어지는 경우 객체를 처리합니다. 그러나 ARC는 모든 메모리 문제를 방지하지 않습니다. - 참조 유형, 데이터 구조 및 리소스 수명주기에 대한 개발자 결정은 중요합니다.
ARC 작품
참고 유형 (class)의 모든 인스턴스에는 유지 수를 가지고 있습니다. 변수에 대한 참조를 할당 할 때 ARC는 계산을 증가합니다. 그 변수가 범위에서 나올 때 또는 , ARC는 카운트를 줄입니다. 객체는 카운트가 0에 도달 할 때 할당됩니다. 이 세분화 처리는 쓰레기 수집 시스템의 핵심 장점이지만 retain]]의 위험을 소개합니다.]]]]]]]]]]]]]]]]]]]]
강력하고, 잉카, 그리고 통일된 참조
ARC는 3개의 참고 유형을 지원합니다:
- Strong (기본): 유지 수를 증가시킵니다. 객체는 적어도 하나의 강력한 참조가 존재하기 때문에 오래 살아있다.
- Weak: 유지 수를 증가하지 않습니다. 참조는 객체가 할당될 때 ]로 자동 설정됩니다. 유지 사이클 (예를 들어, delegate 속성)을 피하는 약한 참조를 사용하십시오.
- Unowned: 약한 것 같지만, 참고된 객체는 ]가 되지 않을 것 입니다. ]를 사용하여 할당된 객체는 실행시간 충돌을 발생시킵니다. 예 는 특정 객체가 참조를 능가하지 않는 한, 예시합니다.
이러한 구별은 메모리 누출과 충돌 방지에 필수적입니다. 예를 들어, 캡쳐링 ]]은 ]]이 수행되는 폐쇄 내부에 강력하게 결합된 고전적인 유지 사이클을 만듭니다.
최적의 Memory 사용법을 위한 모범 사례
이러한 관행을 지속적으로 감소시키고, 성능 향상, 그리고 iOS 메모리 워치독에 의해 종료의 위험을 최소화.
일반적으로 계기로 Profile
Xcode Instruments는 메모리 분석을위한 가장 강력한 도구입니다. 주요 도구는 다음과 같습니다.
- Allocations: 객체 생성 및 할당을 추적합니다. 동작 사이 메모리 사용을 비교하기 위해 "Mark Generation" 기능을 사용합니다.
- Leaks: 자동적으로 누출된 개체를 감지합니다. 개발 중에이 기기를 자주 실행하십시오.
- VM Tracker: 큰 데이터에 대한 사용량보다 더 많은 정보를 제공 할 수있는 더러운 페이지를 포함하여 가상 메모리를 모니터링.
개발 워크플로우의 일부를 프로파일링하기 — 특히 릴리스 전에. ]Apple Instruments 문서은 해석 결과를 상세하게 안내합니다.
메모리 경고에 응답
iOS는 메모리에 낮은 경우 를 보냅니다. 응답에 직면하면 충돌로 이어질 수 있습니다. 를 구현하여 릴리스에 대한 뷰 컨트롤러에서:
- 캐시 객체 (예 :, 또는 사용자 정의 사전)
- 디스크에서 재부팅 할 수있는 큰 이미지
- 재사용 가능한 보기 모델 또는 비-critical 데이터
예시 구현:
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
imageCache.removeAllObjects()
thumbnailCache.removeAllObjects()
// Clear any other disposable resources
}
또한, overriding 을 고려하여 볼 때 필요한 무료 리소스를 무료로 고려하십시오.
Retain 주기를 피하기
Retain 주기는 iOS 앱에서 가장 일반적인 메모리 누출입니다. 일반적인 시나리오는 다음과 같습니다.
- Delegation:]로 디레게이트 속성을 디레딩한다.
- Closures: 폐쇄 캡처 ]] 를 저장하고 으로 캡처 목록: 또는 ].
- Nested closures: 캡처 리스트를 각 마감에 따라 고유한 참조를 캡처합니다.
안전한 마감의 예:
networkManager.fetchData { [weak self] result in
guard let self = self else { return }
self.updateUI(with: result)
}
]] 를 사용할 때만 ]] 는 종료 종료 전에 할당되지 않습니다 (예를 들어, 짧은 라이브 애니메이션).
Data 로딩
메모리 폐기물 자원에 불필요한 데이터를 적재합니다. 이러한 기술을 고용하십시오.
- Lazy Instantiation: 필요한 때까지 비싼 물건의 지연 생성.
- Batch fetching: Core Data를 사용하여, 한 번에 메모리에 모든 객체를 적재하는 것을 방지하기 위해 제한 및 배치 크기를 사용합니다.
- ] : ]] 대신 ]] 캐시에 대 한 - 그것은 자동으로 메모리 압력 하에서 개체를 퇴치.
- Downsample image: 엄지나일을 표시할 때, 메모리에 전체 해상도 이미지를 유지하기 위해 를 사용하여 스케일을 생성한다.
네트워크 응답을 위해, JSON incrementally ([]]])를 강제로 정의하거나 ]과 같은 스트리밍 패서더를 큰 페이로드와 함께 사용합니다.
View Controllers의 리소스를 넓히기
컨트롤러는 종종 수많은 리소스를 소유합니다. 관찰자, 타이머, 제스처 인식자 및 대형 데이터 구조. 항상 또는 적절한 라이프 사이클 방법 청소:
- 관찰자 등록 제거 (, KVO)
- 잘못된 타이머 및 디스플레이 링크
- 화면을 떠나면 네트워크 작업을 취소
- ]에 재사용 가능한 무거운 물건을 ]에 설정하십시오.
고급 메모리 관리 기술
제한을 밀어주는 앱을 위해 - 큰 데이터셋, 실시간 렌더링, 또는 배경 처리와 같은 - 더 깊은 기술이 필요합니다.
Autorelease Pools 사용
Autorelease 풀은 런 루프 침속의 끝에 자동으로 배수하지만 무거운 루프 (예를 들어, 큰 배열을 처리) 동안 많은 개체를 축적 할 수 있습니다. 명시적 Autorelease 풀에서 루프 바디를 랩하여 개체를 곧 출시 할 수 있습니다.
for i in 0..<100000 {
autoreleasepool {
let heavyObject = createHeavyObject(i)
// use heavyObject
}
}
이것은 극적으로 피크 메모리 사용량을 감소시킵니다. ]Autorelease Pools에 대한pple 문서는 세부 사항에 메커니즘을 설명합니다.
Value Types vs. 참고 유형
Swift struct(value type)은 인라인으로 저장되며, 힙 할당을 줄일 수 있습니다. 모델 객체의 Prefer struct는 단순한 값 semantics을 가지고 있습니다. 그러나, 큰 구조가 겹쳐 쌓이거나 복사 비용을 일으킬 수 있다는 것을 알고 있습니다. wrapping 또는 를 복잡한 구조에 대한 로 사용하십시오.
메모리 매핑 큰 파일
대용량 데이터 파일(비디오, 데이터베이스)의 경우, ]로 메모리 매핑을 사용하여 스왑 공간 없이 데이터를 로드합니다. ] Swift에서 옵션으로 만들 수 있습니다. 이로 인해 로딩을 허용하고 이중 메모리 사용(disk cache vs. in-memory)을 피할 수 있습니다.
if let data = try? Data(contentsOf: fileURL, options: .mappedIfSafe) {
// use data — pages are loaded on demand
}
Memory mapping은 dictionaries 또는 precomputed Asset과 같은 읽기 전용 데이터에 특히 효과적입니다.
배경 작업 및 메모리 제약
배경 작업을 수행 할 때 (예 : ]), 메모리가 제한됩니다. 종료를 피하기 위해 배경 실행 동안 메모리 사용 감소. 낮은 메모리 상황을 처리하기 위해 를 사용하여 또는 전경에 큰 작업을 방어합니다.
일반적인 메모리 문제 및 솔루션
주의적 계획도, 메모리 문제는 표면 할 수 있습니다. 여기에 전형적인 문제와 치료입니다.
좀비 개체와 랑글 포인터
오버 릴리즈 객체는 ]로 충돌합니다. Xcode의 계획 설정에서 좀비 개체 진단을 사용하여 개발 중에 이러한 것을 감지합니다. 루트 원인은 종종 강한 약한 참조 사이에 잡기이며, 특히 조기에 출시되거나 제대로 설정되지 않는 delegates .
계측기와 메모리 누출 감지
일반적인 사용자 흐름을 수행하는 동안 누출 장비를 실행하십시오. 특별한 관심을 지불하십시오.
- 컨트롤러 전환보기 (push/pop)
- Modal 발표
- 캡처 된 참조가있는 폐쇄
- 제3자 도서관
누출이 나타나면 Debug Memory Graph Tool(Xcode의 메모리 그래프 디버거)에 참고 그래프를 검사합니다. 이 시각적 표현은 종종 주기를 즉시 나타냅니다.
기억 스파이크와 그들의 뿌리 원인
Sudden 메모리 스파이크는 일반적으로 발생:
- 대형 이미지 로딩: 디스플레이에 필요한 크기로 항상 축소 이미지. ]]를 사용하여 엄지나일.
- JSON parsing: 펑크에 JSON을 분산하거나 거대한 응답을 위해 스트리밍 패서더를 사용합니다.
- ] unbounded: ]에 제한을 설정하고 캐시를 촉구적으로 맑게 합니다.
- 시간 또는 CADisplayLink: 사용되지 않을 때 그들은 부당하게 됩니다.
Allocations 악기와 설정 메모리 경고 브레이크 포인트 스파이크를 잡기 위해 피크 메모리를 모니터링 합니다.
관련 기사
iOS 앱의 최적화 메모리 관리는 ARC에 대한 이해를 섞는 지속적인 과정으로, 숙련된 코딩 관행과 일반 프로파일링을 갖춘 과정입니다. 약한 참조를 사용하여 기본으로 시작하며, 메모리 경고에 응답하고, 인덱스와 프로파일링을 통해, Autorelease Pools와 메모리 매핑과 같은 고급 기술을 채택하여 고성능 시나리오를 위한 고급 기술을 채택했습니다. 개발 워크플로로 메모리 분석을 통합하여 Apple의 진화 도구로 날짜까지 유지하면, 빠른 세부 사항, WLT(Remote Experience), WLT(Remote Evaluation), WLT(Remote Evaluation), WLT(Regory) 등을 통해 사용자의 메모리 관리에 대한 이해를 줄일 수 있습니다.[CLT].