viewDidUnload

언어/Objective - C 2017. 3. 17. 10:06

viewDidUnload 메서드는 Memory Warning Memory Warning 메시지를 시스템에서 현재 활성 중인 프로그램에게 전달하면 iOS delegate 메서드 중에 viewDidUnload 호출하도록 한다.

해당 화면이 다시 그려질 필요가 있을 viewDidLoad메서드가 호출되고 다음이 viewWillAppear 메서드 호출 순으로 가게 된다. 따라서 다시 내용을 불러오려면 viewDidLoad 오버라이딩 해서 처리하면 된다.


viewDidUnload 메서드에서 주로 작성해야 내용은

먼저 First Responder 뷰가 아닌 뷰들과 관계하여 굳이 메모리에 유지 되어야 필요 없는 IBOutlet들을 해제해주면 좋다

)

- (void)viewDidUnload {

self.nameField = nil;

self.numberField = nil;

self.sliderLabel = nil;

self.leftSwitch = nil;

self.rightSwitch = nil;

self.doSomethingButton = nil;

[super viewDidUnload];

}


self.nameField = nil 의미는 [self setNameField:nil] 같은 의미이다. ,


- (void)setNameField:(UITextField *)_param_nameField {

[_param_nameField retain];

[nameField release];

nameField = _param_nameField;

}

이런식으로 세터가 자동으로 구성되어지므로 self.nameField 무사히 nil 할당 받는다.

viewDidLoad 메서드는 nib 파일로부터 해당 뷰들이 모두 메모리에 load 후에 호출되는 메서드이다.

viewDidUnload 기본적으로 UIControlView 관련한 객체들에 대한 메모리 관리를 위한 메서드이지 모든 객체들에 대한 메모리 할당 해제 관리를 책임지기 위한 메서드가 아니다. 오로지 IBOutlet 객체에 대해서만 메모리 관리를 해주는 메서드로 이용하자.

메서드를 마치 iPhone 내에 virtual Memory 제어 하듯이 쓰지 말자. 분명히 여기저기 탈나고 코드가 못생겨진다.


viewDidUnload 메서드에서 객체들을 nil처리 있는 것은 나중에 다시 화면에 그려질 필요가 있을 viewDidLoad에서 이전에 값을 인지할 필요 없이 초기화할 있는 객체들만 가능하다

가장 쉬운 예가 nib파일에 있는 내용으로 메모리 부족으로 warning system call 오면 nib 파일에 해당 내용이 있으므로 간단하게 할당 해제해줘도 나중에 필요시 nib파일에서 다시 로드시키면 된다.


하지만 이전 값을 반드시 기억해야 하는 경우는 따로 디스크에 deep copy 하지 않는한 불러오는 것은 불가능하기 때문에 일률적으로 nil처리 하면 다시 찾아올 방법이 없다.

Posted by 知彼知己百戰不殆
,