16

첫 번째 앱을 시작할 새 개발자입니다. 아이폰 OS 6에iOS 6 용 viewWillUnload 사용 중단 및 didReceiveMemoryWarning으로 이동

이 의 UIViewController의 viewWillUnload 및 viewDidUnload 방법은 현재 사용되지 않습니다 나는 애플의 아이폰 OS 6 릴리스 노트에 아래와 같이 viewDidUnload의 중단에 대한 혼란 스러워요. 이러한 메서드 을 사용하여 데이터를 릴리스하는 경우 대신 didReceiveMemoryWarning 메서드를 사용하십시오. 은이 방법을 사용하여 뷰 컨트롤러보기에 대한 참조를 해제 할 수 있습니다. 이 작업을 수행하기 전에 뷰가 창에없는 것을 테스트해야합니다.

왜 이런 일이 발생합니까? 이 변경으로 인해 앱에서 성능 문제가 발생하지 않도록하기 위해 어떤 지침을 따라야합니까?

감사합니다.

+0

그런 짓을? –

답변

17

애플에 따르면, 그들은 viewWill/DidUnload에있는 것들을 파괴함으로써 얻을 수있는 이득이 최소가되기에 충분한 전망을위한 내부 메모리 관리를 개선했다. 게다가 그들은 많은 앱이 추락한다는 데이터를 가지고 있습니다. 앱이 이러한 알림을 제대로 처리하지 못하고 뷰 언로드와 관련이없는 '기타'작업을 수행하기 때문입니다.

마지막으로, 메모리 부족으로 인해 응용 프로그램이 종료되기 전에 얻을 수있는 첫 번째이자 유일한 경고로 메모리 경고가 확인되므로 실제로 메모리 문제를 처리 할 수있는 장소입니다.

기본적으로 viewWillUnloadviewDidUnload 방법을 삭제하면됩니다. didReceiveMemoryWarning 및 기타 적절한보기 컨트롤러 관리에서 메모리 문제를 처리하십시오.

편집 물어 수

: 그 "appropiate 장소"무엇인가? 내가보기에 [Will/Did] Disappear가 완전히 적합하지 않은 특정 상황에서 ViewdidUnload를 사용했습니다. 내비게이션 컨트롤러 스택을 계속 내려가는 것과 같습니다. 더 자세히 설명해 주시겠습니까? - Dan1one

다릅니다. 나는 그것이 당신이 듣고 싶어하는 것이 아니라는 것을 알고 있습니다. 사실입니다 :-)

일반적으로, 당신은 비대칭을 피해야합니다. 따라서 원본을 "수행"한 대칭 방법을 사용하여 작업을 "실행 취소"해야합니다. 일반적으로 viewDidUnload 유형의 모든 작업을 didReceiveMemoryWarningdealloc에 수행 할 수 있어야합니다.

어쨌든이 두 곳에서 대부분의 코드를 복제해야했기 때문에 실제로 변경하지 않아야합니다.

"네비게이션 컨트롤러 스택을 계속 내려가는 것"이 ​​무슨 뜻인지 알지 못하므로 유용한 응답을 제공하는 예제를 명확히해야합니다.

viewDidDisappearviewDidAppear을 사용할 때의 문제점 중 하나는보기가 실제로 나타나거나 실제로 나타나는 모습이 사라지는 것을 알기가 어려웠 기 때문입니다. .API의

이 조각은 당신이 그 문제를 해결하는 데 도움이 가정된다 : 아이폰 OS 6에서

- (BOOL)isMovingFromParentViewController 
- (BOOL)isMovingToParentViewController 
- (BOOL)isBeingDismissed 
- (BOOL)isBeingPresented 
+0

나는 "적절한 장소"란 무엇인가 물어볼 수 있습니까? 뷰 [Will/Did] Disappear가 전적으로 적합하지 않은 특정 상황에서 ViewdidUnload를 사용했습니다. 네비게이션 컨트롤러 스택을 계속 내려가는 것. 더 자세히 설명해 주시겠습니까? – Dan1one

+0

@ Dan1one : 음 ...'viewDidUnload'는 스택이나 다른 대부분의 상황에서 팝업 될 때 호출되지 않습니다. 그래서 나는 당신이 무엇을하고 있었는지 전혀 모른다. – user102008

+0

내가 몇 달 동안 본 가장 큰 대답. 고맙습니다! –

8

은,보기가 언로드되지 않습니다.

즉, loadViewviewDidLoad은 한 번만 호출되며 viewDidUnload은 호출되지 않습니다. 따라서보기 컨트롤러가 viewDidUnload을 사용하여 메모리 부족 상태를 처리하면 변경해야합니다.

낮은 메모리 조건에 응답하려면 didReceiveMemoryWarning을 구현하고이 방법으로 임시 데이터와 개체를 릴리스하십시오. 우리가 해결할에 의해 뷰를 해제해야합니다 아이폰 OS 6에서

6

는 현재 앱에 대한 viewDidUnload을 사용하고있는이

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 

    if([self isViewLoaded] && self.view.window == nil) 
    { 
     self.view = nil; 
    } 
}