iOS 메모리 부족 시 경고 및 처리 과정 분석

5590 단어 iOS메모리
메모리 경고
ios 에서 모든 app 에서 사용 할 수 있 는 메모리 가 제한 되 어 있 습 니 다.만약 에 app 에서 사용 하 는 메모리 가 이 밸브 값 을 초과 하면 시스템 은 이 app 에 Memory Warning 메 시 지 를 보 냅 니 다.메 시 지 를 받 은 후에 app 은 가능 한 한 불필요 한 메모 리 를 많이 방출 해 야 합 니 다.그렇지 않 으 면 OS 가 app 을 닫 습 니 다.
몇 가지 메모리 경고 단계(메모리 경고 후의 행동 을 이해 하기 쉽 습 니 다)
 Memory warning level:

typedef enum {
                     OSMemoryNotificationLevelAny      = -1,
                     OSMemoryNotificationLevelNormal   =  0,
                     OSMemoryNotificationLevelWarning  =  1,
                     OSMemoryNotificationLevelUrgent   =  2,
                     OSMemoryNotificationLevelCritical =  3
                     }OSMemoryNotificationLevel;(5.0 )
            1.Warning(not-normal)―불필요 한 배경 프로그램 을 종료 하거나 닫 습 니 다.예 를 들 어 Mail
            2.Urgent―모든 백 엔 드 프로그램(예:Safari and iPod)을 종료 합 니 다.
            3.Critical and beyond―재 개
메모리 경고 응답:
응용 프로그램 의뢰 에서 applicationDid ReceiveMemory Warning:방법:
            응용 프로그램 의뢰 대상 에서 메모리 경고 메 시 지 를 받 습 니 다.
UIViewController 하위 클래스 에서 didReceiveMemory Warning 방법 을 구현 합 니 다:
            보기 컨트롤 러 에서 메모리 경고 메시지 수신
등록 UIApplicationDidReceiveMemory 경고 알림:
            다른 클래스 에 서 는 메모리 경고 메 시 지 를 받 는 알림 을 사용 합 니 다(예:캐 시 데이터 정리)
View Controller
뷰 생 성:
loadView
1.loadView 는 매번 self.view 라 는 property 를 사용 하고 self.view 가 nil 일 때 호출 되 어 효과 적 인 self.view(수 동 으로 views 를 유지 하려 면 이 방법 을 다시 써 야 합 니 다)를 만 듭 니 다.
2.view 컨트롤 러 가 didReceiveMemory Warning 메 시 지 를 받 았 을 때 기본 적 인 실현 은 현재 컨트롤 러 의 view 가 사용 되 고 있 는 지 확인 하 는 것 입 니 다.현재 사용 하고 있 는 view hierarchy 에 view 가 없 으 며 컨트롤 러 가 loadView 방법 을 실현 한다 면 이 view 는 release 되 고 loadView 방법 은 새로운 view 를 만 드 는 데 다시 조 정 됩 니 다.(주:ios 6.0 이하 loadview 가 구현 되 지 않 으 면 메모리 경고 시 viewdUnload 를 호출 하지 않 습 니 다)
viewDidLoad
일반적으로 우 리 는 여기에서 인터페이스의 초기 화 작업 을 합 니 다.예 를 들 어 view 에 하위 보 기 를 추가 하거나 데이터베이스 나 네트워크 에서 모델 데 이 터 를 하위 보기 로 불 러 옵 니 다.
홈 페이지 에서 제공 하 는 view 생 성 프로 세 스 맵:

홈 페이지 에서 제공 하 는 마 운 트 해제 view 의 흐름 도:

On iOS 5 and Earlier
1 시스템 이 경 고 를 보 내 거나 ViewController 자체 가 호출 되 어 didReceiveMemory Warning 이 호출 되 었 습 니 다.
2 view Will Unload 를 호출 한 후 View 를 방출 합 니 다.
3.viewDidUnload 호출
ios5.0 LeaksDemo 

 -(void)didReceiveMemoryWarning
{
    //In earlier versions of iOS, the system automatically attempts to unload a view controller's views when memory is low
    [super didReceiveMemoryWarning];

         //didReceiveMemoryWarining ViewController view window , window , didReceiveMemoryWarining viewcontroller view view , viewcontroller viewdidunload 。


}
- (void)viewDidUnload
{
    // release viewDidLoad
    // For example:
       self.myOutlet = nil;
    self.tableView = nil;
    dataArray = nil;
  
    [super viewDidUnload];
}

On iOS 6 and Later
1 시스템 이 경 고 를 보 내 거나 ViewController 자체 가 호출 되 어 didReceiveMemory Warning 이 호출 되 었 습 니 다.
2 - (void)didReceiveMemoryWarning;현재 사용 하지 않 는 자원 방출
ios6.0 LeaksDemo

 -(void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];// window , self.view 。 ios6.0
    // Add code to clean up any of your own resources that are no longer necessary.
    // ios6.0 , 6.0 ,6.0 , self.view viewDidUnLoad
    if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) {
        // self.isViewLoaded , , WWDC 。
        if (self.isViewLoaded && !self.view.window)//
        {
            // Add code to preserve data stored in the views that might be
            // needed later.
            // Add code to clean up other strong references to the view in
            // the view hierarchy.
            self.view = nil;// viewDidLoad 。
        }
    }
}
메모리 부족 시 처리
우리 가 많은 응용 프로그램 과 3d 게임 을 열 때 프로그램 메모리 가 부족 하면 메모리 경고 가 발생 합 니 다.그러면 메모리 다음 에는 무엇 을 왼쪽 으로 할 까요???
메모리 경 고 는 프로 세 스 문제 와 관련 이 있 습 니 다!모든 프로그램 은 하나의 프로 세 스 입 니 다.어떤 프로 세 스 는 프로그램 이 백 스테이지 에 들 어간 후에 휴면 을 시작 합 니 다.어떤 프로그램 은 백 스테이지 에 들 어가 도 프로그램 을 계속 실행 합 니 다.예 를 들 어 QQ!컨트롤 러 가 메모리 경 고 를 받 은 후에 다음 과 같은 방법 을 할 것 입 니 다.
1.컨트롤 러 가 메모리 경 고 를 받 았 을 때 didReceiveMemory Warning 방법 을 호출 합 니 다.
2.didReceiveMemory Warning 방법 내부 의 기본 값 은 다음 과 같 습 니 다.먼저 컨트롤 러 의 view 가 화면 에 없 는 지 확인 합 니 다.

if (self.view.superview == nil) { // view
// view
// , viewWillUnload
// , viewDidUnload
} else {

// view
}

3.컨트롤 러 의 view 를 다시 사용 해 야 할 때 loadView 방법 으로 view 를 만 듭 니 다.
4.이 어 일련의 생명주기 방법 을 사용한다.
viewDidLoad ―> ……
5.라 이 프 사이클 순환
loadView C>viewDidLoad C>..보 이 는..C 메모리 경고 C>didReceiveMemory 경고―>viewWillUnload C>viewDidUnload―다시 사용―>loadView
그래서 프로그램 메모리 가 너무 많 을 때 배경 에 마 운 트 된 QQ 가 출시 된 경우 가 있 습 니 다!우리 가 다시 클릭 할 때,QQ 는 다시 불 러 와 서 실행 합 니 다!

좋은 웹페이지 즐겨찾기