[memory-management] iPhone OS 메모리 경고. 다른 수준은 무엇을 의미합니까?

iPhone OS 기기에서 메모리를 관리하는 블랙 아트에 대해 : 다양한 수준의 메모리 경고가 의미하는 것은 무엇입니까? 레벨 1? 2 단계? 다이얼이 11 번으로 가나 요?

컨텍스트 : iPod 음악 플레이어 앱이 재생되는 상태에서 iPad 앱을 실행하는 것을 포함하여 광범위한 메모리 스트레스 테스트 기간을 거친 후, 수신되는 무작위이지만 드물게 나타나는 메모리 경고를 무시하는 경향이 있습니다. 내 앱 이 충돌 하지 않습니다 . 이제까지. 내 앱은 유출이 없습니다. 그리고 mems 경고는 중요하지 않은 것 같습니다.

고마워,
더그



답변

기본적으로 경고는 장치의 메모리가 부족 하다는 것을 의미하며 , “만약 당신이 적극적으로 사용하지 않는 메모리를 확보 할 수 있다면 그것은 부풀어 오를 것입니다! “라는 의미입니다. 메모리 관리가 빡빡하고 실제로 버릴 수있는 개체가없는 경우 메시지를 전달하고 무시하십시오.


답변

메모리 수준 경고는 SpringBoard에 의해 기록됩니다. 앱 개발자는 신경 쓸 필요가 없습니다. 응답만으로 -{application}didReceiveMemoryWarning충분합니다.


경고에는 4 단계 (0 ~ 3)가 있습니다. 이는 커널 메모리 감시자에서 설정되며 not-so-public 함수OSMemoryNotificationCurrentLevel() 로 얻을 수 있습니다 .

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

레벨이 트리거되는 방법은 문서화되어 있지 않습니다. SpringBoard는 각 메모리 레벨에서 다음을 수행하도록 구성됩니다.

  1. 경고 (비정상) — 메일과 같이 불필요한 백그라운드 앱을 다시 시작하거나 자동 다시 시작을 지연합니다.
  2. 긴급 — 모든 백그라운드 앱 (예 : Safari 및 iPod)을 종료합니다.
  3. Critical and beyond — 커널이 인수되어 SpringBoard를 죽이거나 재부팅 할 수도 있습니다.

활성 앱 (jetsam)을 종료하는 것은 SpringBoard에서 처리하지 않고 launchd.


답변

에서 OSMemoryNotification.h ,

/*
** Threshold values for notifications
*/

typedef enum {
    OSMemoryNotificationLevelAny      = -1,
    OSMemoryNotificationLevelNormal   =  0,
    OSMemoryNotificationLevelWarning  =  1,
    OSMemoryNotificationLevelUrgent   =  2,
    OSMemoryNotificationLevelCritical =  3
} OSMemoryNotificationLevel;

totoal 5 레벨의 메모리 경고 (-1,3).

메모리 수준 경고 설명과 관련하여 @KennyTM의 대답은 훌륭합니다.

PM과 다른 사람들에게 도움이 될 수있는 몇 가지 관련 사항을 추가하고 싶습니다.


메모리 수준 경고가 발생하면 어떻게해야합니까?

이러한 경고 중 하나를 수신하면 처리기 메서드는 불필요한 메모리를 즉시 확보하여 응답해야합니다. 예를 들어, UIViewController 클래스의 기본 동작은 해당 뷰가 현재 표시되지 않는 경우 해당 뷰를 제거하는 것입니다. 하위 클래스는 추가 데이터 구조를 제거하여 기본 동작을 보완 할 수 있습니다. 이미지 캐시를 유지하는 앱은 현재 화면에없는 이미지를 해제하여 응답 할 수 있습니다.


메모리 레벨 경고를 관찰하는 방법은 무엇입니까?

에서 http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

시스템이 앱에 메모리 부족 경고를 전달하면 즉시 응답하십시오. iOS는 사용 가능한 메모리 양이 안전 임계 값 아래로 떨어질 때마다 실행중인 모든 앱에 알립니다. (일시 중단 된 앱에 대해서는 알리지 않습니다.) 앱에서이 경고를 받으면 가능한 한 많은 메모리를 확보해야합니다. 이를 수행하는 가장 좋은 방법은 캐시, 이미지 개체 및 나중에 다시 만들 수있는 기타 데이터 개체에 대한 강력한 참조를 제거하는 것입니다.

UIKit은 다음을 포함하여 메모리 부족 경고를 수신하는 여러 방법을 제공합니다.

  • 앱 대리자의 applicationDidReceiveMemoryWarning : 메서드를 구현합니다.
  • 사용자 지정 UIViewController 하위 클래스에서 didReceiveMemoryWarning 메서드를 재정의합니다.
  • UIApplicationDidReceiveMemoryWarningNotification 알림을 수신하려면 등록하십시오.

앱의 메모리 공간을 줄이는 방법은 무엇입니까?

  • 메모리 누수를 제거합니다.
  • 리소스 파일을 가능한 한 작게 만드십시오.
  • 대용량 데이터 세트에는 Core Data 또는 SQLite를 사용하십시오.
  • 리소스를 느리게로드합니다.
  • Thumb 옵션을 사용하여 프로그램을 빌드하십시오.

자세한 내용은 http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html참조하십시오.


메모리를 현명하게 할당하는 방법은 무엇입니까?

  • 자동 해제 된 객체 사용 줄이기 : 자동 참조 계수 (ARC)를 사용하면 객체 를 할당 / 초기화하고 컴파일러가 적절한 시간에이를 해제하도록하는 것이 좋습니다. 이는 과거에 현재 메서드의 범위를 벗어나는 것을 방지하기 위해 자동 해제 된 임시 개체의 경우에도 마찬가지입니다.
  • 리소스에 크기 제한 적용 : 작은 리소스 파일이로드되는 경우 큰 리소스 파일을로드하지 마십시오. 고해상도 이미지를 사용하는 대신 iOS 기반 장치에 적합한 크기를 사용하십시오. 대용량 리소스 파일을 사용해야하는 경우 지정된 시간에 필요한 파일 부분 만로드하는 방법을 찾으십시오. 예를 들어, 전체 파일을 메모리로로드하는 대신 mmap 및 munmap 함수를 사용하여 파일의 일부를 메모리 안팎으로 매핑합니다. 파일을 메모리에 매핑하는 방법에 대한 자세한 내용은
  • 제한되지 않은 문제 집합 방지 : 제한되지 않은 문제 집합은 계산하는 데 임의로 많은 양의 데이터가 필요할 수 있습니다. 세트에 사용 가능한 것보다 더 많은 메모리가 필요한 경우 앱에서 계산을 완료하지 못할 수 있습니다. 앱은 가능한 한 이러한 세트를 피하고 알려진 메모리 제한 문제를 해결해야합니다.


답변