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처리 하면 다시 찾아올 방법이 없다.
'언어 > Objective - C' 카테고리의 다른 글
[Error] Could not insert new outlet connection: Could not find any information for the class named (0) | 2017.03.24 |
---|---|
[Error] ARC forbids explicit message sent... (0) | 2017.03.18 |
delegate, protocol 개념 (0) | 2017.03.17 |
[Error] libc++abi.dylib: terminating with uncaught exception of type NSException (0) | 2017.03.16 |
IOS 개발 관련 자료 사이트 (0) | 2017.03.08 |