2012-06-06 3 views
3

메모리가 부족할 때 dealloc을 호출할까요? 그것이 사실이라면 didReceiveMemoryWarning 이전에 호출되는 것입니까? 또한보기 컨트롤러가 해제 될 때 dealloc이 호출 될 것입니까?didReceiveMemoryWarning과 dealloc의 관계는 무엇입니까?

+0

그건 그렇고, 시뮬레이터는 메모리 경고 이벤트를 시뮬레이트 해보니 정확히 무엇을하는지 볼 수 있습니다. 다양한보기 컨트롤러 메소드 (예 : viewDidLoad, viewDidUnload, dealloc, didReceiveMemoryWarning 등)에 NSLog 문 또는 기타 유사한 정보를 입력하면 해당 작업이 무엇을하는지 정확히 알 수 있습니다. – Rob

답변

3

didReceiveMemoryWarning은 단순히 메모리가 부족하다는 것을 알려주는 것입니다. 보기도 컨트롤러도 해제되지 않습니다. 반면에 iOS 6 이전에는 viewDidUnload이 동시에 수신 되었기 때문에 뷰가 제거되었지만 뷰 컨트롤러는 삭제되었다는 것을 알 수 있습니다. 그래서 didReceiveMemoryWarning을 덮어 쓰기 때문에보기 컨트롤러가 안전하게 릴리스 할 수있는 다른 모든 항목을 확보 할 수 있습니다. 그러나 이러한 메모리 부족 상황에서는 뷰 컨트롤러가 절대로 출시되지 않습니다. 최악의 시나리오 인 경우 viewDidUnload이 호출되면보기는 해제되지만 컨트롤러는 해제되지 않습니다.

메모리는 아이폰 OS에서 중요한 자원이며, 뷰 컨트롤러는 을 제공하는 내장 된 중요한 시간에 자신의 메모리 풋 프린트를 줄이기위한 지원 :

는 참고로, 필자는 문서에서 인용. UIViewController 클래스는 didReceiveMemoryWarning 메서드를 통해 메모리 부족 상태 인 을 자동 처리하고, 불필요한 메모리를 해제하는 메서드를 제공합니다.

메모리 부족 경고가 발생하면 UIViewController 클래스는 나중에 다시로드하거나 다시 다시 만들 수 있음을 알고있는 경우 보기를 제거합니다. [6.0 이전의 iOS 버전을 실행하는 경우이 문제가 발생 경우, 그것은 또한로드 개체를 포함하여 코드를보기 계층 구조와 연관된 모든 개체의 소유권을 포기 수있는 기회를 제공하기 위해 viewWillUnloadviewDidUnload 메소드를 호출 nib 파일, viewDidLoad 메소드에서 생성 된 객체 및 런타임에 느리게 생성 된 객체를 계층 보기에 추가했습니다. 시스템 가능한 메모리의 양이 낮다고 판단한 경우

[didReceiveMemoryWarning]

호출된다. 이 메소드의 디폴트 구현 인 은 [6.0 이전의 iOS 버전에서] 뷰 컨트롤러의 뷰를 해제하려고 시도합니다. 해제하려면 보기에는 수퍼 뷰가 없어야합니다. 즉, 뷰 계층의 일부가 아닙니다. 보기를 언로드하는 방법에 대한 자세한 내용은 “The View Controller Life Cycle”을 참조하십시오.

보기 컨트롤러가 사용하는 추가 메모리를 해제하려면이 메서드를 재정의 할 수 있습니다. 이 메소드를 구현하면, 뷰는 어떤 시점에서 슈퍼 구현을 호출하여 뷰 컨트롤러가 뷰를 해제 할 수있게해야합니다. 보기 컨트롤러가 뷰 계층 구조의 뷰에 대한 참조를 보유하고있는 경우 viewDidUnload 메소드에서 해당 참조를 해제해야합니다 ( 참조).

업데이트 : 예, (당신이 didReceiveMemoryWarning가 호출 될 때 해당 뷰 컨트롤러는 자체가 해제되지 않은 실현 이니까 걱정하지 않을 수 있습니다) 다른 질문에 대한 대답에서

때 아이템은 마침내 릴리즈됩니다 (그리고 보유 카운트가 0입니다, 즉 alloc과 모든 retain이 모두 해당 릴리스 문에 의해 상쇄됩니다). 그러면 dealloc이 호출됩니다.

3

didReceiveMemoryWarning은 불필요한 자원을 삭제하여 메모리 부족 상황에 대응할 수있는 기회를 제공합니다.

뷰 컨트롤러 또는 다른 개체가 해제되고 보유 횟수가 0으로 감소하면 삭제되고 해당 dealloc이 호출됩니다.

오브젝트가 해제되었지만 보유 계수가 0으로 줄어들지 않으면 삭제되지 않으므로 dealloc이 호출되지 않습니다.

오브젝트가 삭제 될 때 dealloc이 호출됩니다. 삭제 및 해제는 동일한 것이 아닙니다. 보유 수가 0이되면 개체가 삭제됩니다.

관련 문제