아마도 아이폰 개발을 하면서 제일 먼저 하게 되는것은 아마도 UIViewController 의 life cycle 을 이해하는 것일 것입니다. UIViewController 을 만들어 낼때는 두가지 방법이 있습니다. IB 를 이용해서 xib 를 만들어서 하는 방법과, 그냥 IB 를 이용하지 않고 (xib 없이) 오로지 코딩을 통해서만 하는 방법입니다. 이러한 두가지 방법중 어떤 방법을 사용하더라도 UIViewController 의 life cycle 을 이해 하는것은 굉장히 중요합니다. 언제 어느 시점에 적절한 뷰 생성과, 배치 , 해제를 해줘야 할지 알아야 하기 때문이지요.
UIViewController 의 life cycle 은 나름대로 이해하기 굉장히 쉽습니다. 컨트롤러가 가지고 있는 메소드의 이름들은 그저 이름만 봐도 이해를 할 수 있게 쉽고 동작에 맞는 이름들로 되어 있고, 그 구조 또한 간단하기 때문입니다.
하지만, 딱 하나의 메소드인 viewDidUnload 만은 이해하기 참 힘들었습니다. 굉장히 간단하고, 평범한 메소드 입니다. 그 뜻은 컨트롤러의 뷰가 내려갈때 불리는 함수 입니다. 근데 이것이 참 애매하기 짝이 없습니다.
뷰가 내려갈때란 어떤때를 말하는 것일까요? Controller 가 dealloc 될때 일까요? 저도 처음엔 컨트롤러가 해제될때 dealloc 되면서 뷰가 내려갈테니까 viewDidUnload 가 불리는줄 알았습니다. 하지만, 절대로 불리지 않더군요. 그저 dealloc 만 로그창에 찍고 있을 뿐이었습니다. 그래서 좀더 세심하게 수많은 문서를 보고 구글링을 해보았지만, 돌아오는 답변은, 거의 두가지로 압축이 되더군요.
첫째. viewController 의 view 가 nil 로 세팅될때 불리는 함수이다.
둘째. 메모리 워닝이 통지 될때 (시스템의 메모리 워닝은 UIViewController 에게 Notification을 줍니다.) 가려진 뷰를 가지고 있는 컨틀롤러의 viewDidUnload 가 불린다.
하지만, 여전히 불리는 시점이 명확하지 않았고, 사용되지 않는다는것이 굉장히 애매했습니다.
그래서 샘플 코드를 작성해 보았습니다.
- View Base 로 프로젝트를 하나 만듭니다.
- UIViewController 2개를 만듭니다.
- RedViewController , BlueViewController
- 각 컨트롤러의 뷰의 색깔을 빨강과 파랑으로 만들어 줍니다.
- 새로 만든 두개의 컨트롤러의 뷰를 기본 base view 에 차례대로 붙입니다.
- base view 하단 에는 red button, blue button 을 만들어서 각 버튼을 눌렀을때 각 버튼에 맞는 뷰가 보이도록 코딩 합니다.
- 이때 사용할 방법이 두가지가 있습니다. 첫째는 각 뷰의 hidden 프로퍼티를 사용하여 보여질 뷰에만 NO 를 세팅하고, 감춰질 뷰는 YES 를 세팅하는 방법.
- 두번째가 감춰질 뷰는 removeFromSuperview 메세지를 보내 base view 에서 떼어냈다가 보여질 시점에 다시 addSubview or insertview 하는 방법.
- 그리고, 시뮬레이터에서 가상으로 memory warning 을 발생시키도록 합니다.
위 순서중에 4번을 눈여겨 보시기 바랍니다. 4번의 방법중에 , 첫번째 방법으로 구현하고 5번을 실행할때와, 두번째 방법으로 구현하고 5번을 실행할때 중 어떤 방법으로 구현했을때 viewDidUnload 가 발생하게 될까요?
네. 결론은 두번째 방법으로 구현했을 경우 입니다. 즉, 현재 뷰에서 보여주지 않을 뷰는 (필요하지 않은 뷰는) 구지 super view 에 붙여 놓고 있을 필요가 없습니다. removeFromSuperview 메세지를 보내서 떼어 놔야 iOS 에서 "아~ 이 view 는 사용하지 않는 view구나" 라고 인식합니다. 따라서 iOS 에서 통지하는 Memory Warning 메세지를 View Controller 가 받았을때 자신이 가지고 있는 view 를 사용하지 않고 있다면 view 에 nil 을 세팅하게 되고, 그때, viewDidUnload 가 불리게 됩니다.
디바이스에서는 메모리가 항상 부족하므로, 필요없는 뷰는 그때그때 떼어내고 필요할때 붙여서 쓰면 되고, memory warning 이 발생했을시에는 viewDidUnload 에서 필요없는 객체들 또는 뷰들을 해제시켜 메모리를 확보하면 메모리 크래쉬로 앱이 죽는 일은 쉽게 일어나지 않을것입니다.
코드는 한줄 없이 장황하게 글로만 써서 죄송합니다. 샘플코드 첨부합니다. :) 주석은 없습니다. :-p
'개발&팁 > Mac & Cocoa & iPhone' 카테고리의 다른 글
iPhone Configuration Utility 를 이용한 AdHoc 배포. (3) | 2011.02.24 |
---|---|
xcode3 에서 Target 을 이용한 프로젝트 관리 (3) | 2011.02.23 |
CGContextTranslateCTM 와 CGContextScaleCTM 의 이해. (5) | 2010.10.13 |
iOS 3.0 과 4.0 에서의 이미지 불러오기. (0) | 2010.09.07 |
imageNamed 와 imageWithContentsOfFile 의 차이. (2) | 2010.08.13 |