2009-02-24 3 views
12

나는 크래시 및 메모리 누수를 추적하는 개발 과정에 있습니다. 전략으로 NSLog 메시지 나 알림 중 일부를 didReceiveMemoryWarning:에 넣으시겠습니까? 이 방법에 대한 문서는 드문 드문합니다. 충돌이 일어나기 전에 UIViewController가 해당 메소드를 트리거한다고 말하는 것이 정확합니까? 인스 트루먼 트와 함께 나아 가기 전의 출발점입니까?iOS : didReceiveMemoryWarning의 유용성 :

답변

28

OK, 몇 가지 참고 사항 :

  • didReceiveMemoryWarning 메모리 부족 충돌하기 전에 호출됩니다. 다른 충돌은 없습니다. 경고를 올바르게 처리하고 메모리를 비우면 메모리 부족 상태가 발생하지 않고 충돌을 피할 수 있습니다.
  • 하드웨어 메뉴의 시뮬레이터에서 수동으로 메모리 경고를 트리거 할 수 있습니다. didReceiveMemoryWarning 처리를 테스트하려면이 작업을 수행하는 것이 좋습니다.
  • 인스트루먼트는 누출을 디버그하는 데 도움이됩니다 (모두는 아니지만). 실제로 크래시에는 유용하지 않습니다.
  • 아니요, 개인적으로 NSLog를 사용하지 않습니다. 디버깅 할 때 메모리 경고를 중단하기 만합니다.
+0

안녕하세요. AirSource, 'Simulator -> Hardware -> Simulate Memory Warning'이란 무엇입니까? 클릭 할 때마다 "받은 가상 메모리 경고"라는 메시지 만 표시됩니다. 콘솔에. 어떻게 문제를 '내뿜는데'그것을 사용합니까? 감사. – lionfly

+0

@lionfly - 메모리 경고에 대한 응답으로 최대한 많은 메모리를 확보해야합니다. 메모리 경고를 시뮬레이트하면 해당 코드 경로를 검사 (및 디버그) 할 수 있습니다. –

3

didReceiveMemoryWarning의 목적은 충돌을 피하기 위해 메모리 또는 팝업 뷰를 비울 기회를 제공하는 것입니다. 사용자가 수행하는 작업에 따라 달라 지므로 예측할 수없는 시점에서 수신하지 못합니다. 예를 들어, 사용자가 iPod을 듣고 있다면 사용 가능한 메모리가 적어지고 빨리 수신하게됩니다.

일반적으로 대략 8MB의 RAM이 있어야합니다. 당신이 가까이 오면 당신은 사건이 일어날 것을 기대할 수 있습니다. 의도적으로 많은 RAM을 사용한다면 그것에 대해 뭔가 할 계획이 있어야합니다.

4

업데이트는 아이폰 OS 6으로 , UIViewController보기는 더 이상 메모리 경고에 대한 응답으로 언로드되지 않습니다. 대신 didReceiveMemoryWarning이 호출 될 때 합리적으로 재생성 할 수있는 모든 리소스 (예 : 캐시 된 데이터)를 공개하기 위해 최선을 다하십시오.

업데이트
나는 성난 청년이었을 때 원래의 대답을 적었습니다. 시대가 바뀌었고 기본적으로 잘못되었습니다.

단일보기 컨트롤러가 있고 메모리 경고를받는 앱이 있다면 할 수있는 일이 많지 않습니다. 그러나 모두 언로드 할 수 있기 때문에 여러 개의보기 컨트롤러가있는 경우 상황이 극적으로 바뀝니다. 실제로 [UIViewController didReceiveMemoryWarning]은 보이지 않는 뷰를 언로드하여 올바른 방향으로 안내합니다 (깜짝!). frontmost view 컨트롤러가 닫히면 기본 뷰가 다시로드되고 내부적으로 앱이 완전히 재부팅되었을지라도 대부분 사용자는 지연을 인식해야합니다.

이것은 쉽게 수정할 수있는 세부 정보가 아니므로 처음부터 메모리 사용을 염두에두고 멀티 뷰 프로그램을 완전히 언로드 가능한 UIViewController 조각으로 디자인해야합니다. 실제로 메모리 경고 기능을 사용하기 위해 코드를 시뮬레이터와 호환되도록 유지하는 것이 중요합니다.

메모리가 풍부하면 아무 것도로드되지 않고 모든 것이 부드럽고 매끄 럽습니다. 메모리가 낮 으면 더 느리게 작동하지만 계속 작동합니다. 이제는 유한 메모리 문제에 대한이 솔루션이 이상적이라고 말하고 싶습니다.

당신이 당신의 OpenGL을 누설하지 않으려는 경우 viewDidLoad, viewDidUnload 및 이 viewWillUnload (iOS5를가 유용한 상태를 언로드하는보기를 요구하는 경우 UIViewController 방법은 여전히, 예를 존재 과부하,이 메모리 재주를 활용하려면 텍스처 & 렌더링 버퍼, iOS4에서 didReceiveMemoryWarning을 오버로드하고 뷰의 가시성을 추적하여이를 시뮬레이션 할 수 있습니다.

ORIGINAL, 더 담즙 답변

didReceiveMemoryWarning 절대적으로 쓸모가 없다.

메모리를 확보해도 (심지어 모든 것) 당신이 살해 당할 것이라는 보장은 없습니다. 그것은 일반적으로 2.X/3.0과 같이 작동 나의 쓰라린 경험에

는 :

  1. mediaserverd는

  2. 이 내 응용 프로그램이

불행하게도 살해됩니다

메모리의 무리 누수 사신은 mediaserverd를 죽이는 것을 결코 생각하지 않습니다.

그래서 메모리 사용량 네 잘못이 아닌 경우, 당신이 정말로 단지 두 가지 선택이있어 :

  1. 재부팅 사용자에게

    (사용자가 당신의 잘못입니다 가정을 해치는 리뷰를 쓴다)
  2. 범인의 충돌 (mediaserverd 자주 할것!) 희망

+0

시간이 행진합니다. viewDidUnload는 이제 "메모가 메모리 부족 상태에서 더 이상 제거되지 않으므로이 메서드는 호출되지 않습니다."라는 메모와 함께 더 이상 사용되지 않습니다. 및 "iOS 6 이상에서는보기 컨트롤러에서보기 및 기타 개체에 대한 참조를 지울 필요가 없습니다."- [출처] (https://developer.apple.com/reference/uikit/uiviewcontroller/1621383-viewdidunload?language=objc) – jk7

+0

전일에이 답변을 업데이트 할 생각이었습니다! –

5

사용자가 당신이 당신의 dispos에서 아주 작은 메모리가 열리지 일부 응용 프로그램을두면 al. 그래서 때때로 didReceiveMemoryWarning은 1MB의 사용 후에 만 ​​시스템에서 호출 할 수 있습니다.

시스템은 모든 뷰 컨트롤러에서이 메서드를 호출합니다. 각 뷰 컨트롤러에 NSLog를두면 알 수 있습니다.

그러면 자동으로 viewDidUnload 메서드가 모든 뷰 컨트롤러에서 시스템에 의해 호출됩니다 (dealloc 아님). 따라서 할당 해제 명령을 모두 거기에 넣어야합니다.

앱이 복잡하면 잘 관리하기 전에 많은 충돌이 발생하므로 많은 실험을해야합니다.

관련 문제