2017년 2월 21일 화요일

App 로드시 실행 메서드 순서

-(void) awakeFromNib{}
XIB화일이 객체가 생성된후 바로 불리게 되는뷰. 만약 XIB로 뷰를 생성하지 않았으면 불리우지 않음

-(void)loadView{}
이  XIB로 view 를 생성하지 않고 view을 로드할때 사용된다 

-(void)viewDidLoad{} 
self.view 가 생성된 이후에 불리우게 되는 뷰 

만약 위와 같이 뷰를 불러오는 메소드를  3개 다 쓸 경우에 순서는  아래와 같이 불리우게 된다
-(void) awakeFromNib{} = -(void)loadView{} (awakeFromNib 과 loadView 같은 경우는 같이 쓸 일은 거의 없지만 거의 동시에 불리운다고 생각하면된다 그리고 그후에   -(void)viewDidLoad{} 가 불리운다

-(void)viewWillAppear:(BOOL)animated{}
viewWillAppear는 viewDidload가 불린 이후에 불리게 되는데 
viewDidLoad같은 경우에는  메모리 warning이 발생하여 view 가 없어지지 않는한 viewDidLoad 다시 불리지 않지만
viewWillAppear 같은 경우에는  b라는 화면에 갔다가 다시 a라는 화면에 돌아오면 다시 이 메소드가 호출된다

-(void) viewDidAppear:(BOOL)animated{}
viewDidAppear같은 경우에는 viewWillAppear가 불리운 이후에 화면이 다 로딩 된 이후에  불리우게 된다

.
.

[iPhone] loadView 와 viewDidLoad의 차이점

개발을 하면 할수록 Xcode가 만들어 주는 코드에 대해서 깊은 생각을 하게된다.
그중에 하나가 loadView와 viewDidLoad이다.

apple의 주석은 다음가 같다.
loadView : nib를 생성하지 않고, 프로그래밍으로 뷰계층을 만들경우에 사용하라.
viewDidLoad : view가 로드된 뒤에 추가적인 작업을 할때 사용하라.

나를 포함한 대부분의 개발자는 초반에 viewDidLoad를 사용하고 loadView를 처다보지도 않을 것이다.
왜냐하면 초반엔 다들 Interface builder를 사용할테니까.

그러다가 IB실행도 귀찮아지고, 코드로만 작성하게되는데, 이때 자꾸 loadView가 눈에 걸린다.
간단히 말하면 둘의 역활은 많이 다르다.

loadView는 viewControler.view 를 생성하는 곳이다. 다시 말하면 loadView매소드 안에서는 self.view를 read로 사용할수가 없다.
아직 self.view가 만들어지지 않았기 때문이다.  그러므로 loadView의 코드는 다음과 같이 만들어진다.

- (void)loadView {
     UIView *view = [[UIView alloc] init];
     ...
     [view addSubview:subView1];
     [view addSubview.subView2];
     ....
     self.view = view;
     [view release];
}

viewDidLoad는 기존에 알던데로, view가 메모리에 적재된 후에 추가적인 작업을 하는 곳이다.
loadView -> viewDidLoad

.
.

loadView, viewDidLoad 모두 UIViewController의 인스턴스 메서드들이다.

문서를 보면 

- loadView 
프로그램 코드에서 UIViewController의 view를 생성하고 싶다면 loadView를 오버라이드 해서 그 메서드 view를 생성해야 한다.
테스트 결과 UIViewController의 속성(property)인 view를 다른 커스텀 뷰 클래스의 인스턴스나 혹은 다른 뷰로 변경해서 실행하고 싶다면 이 메서드에서 커스텀 뷰의 생성 코드를 넣으면 된다.

그런 경우가 아니라면 이 메서드는 오버라이드 하지 말아야 한다. 하면 인터페이스 빌더에서 연결한 뷰들이 해당 컨트롤러에 나타나지 않는다.

- viewDidLoad
해당 컨트롤러가 Nib파일에서 언아카이빙되어 뷰가 로드 된 이후 호출 된다.

이 메서드가 불린 시점에서는 다른 Nib파일들의 객체들도 로드가 완료되었으므로 다른 Nib의 객체들에 대한 접근이 가능하다.

컨트롤러가 생성될 때 초기화 코드를 넣을 만한 메서드이다.

.
.

viewController의 view 생성 과정

[self.window addSubView:viewController.view];
1.    viewController.view와 같이 UIViewController객체의 view프로퍼티에 접근하면 
2.    메모리상에 view가 존재하지않으면 loadView이 자동적으로 호출되어진다. 
3-1  loadView가 오버라이드 되어있으면 그 안에서 뷰를 생성하여야 한다. 
3-2. loadView가 오버라이드 되어있지않으면   
       뷰콘트롤러의 nibName,nibBundle properties의 nib파일의 로드를 시도하고 
       nib파일이 없으면 뷰콘트롤러클래스이름의 nib파일의 로드를 시도한다. 
3-3. 로드가능한 nib파일이없으면 empty UIView를 생성한다.

4.    뷰콘트롤러는 viewDidLoad를 실행한다.


출처 : http://wjsb.tistory.com/4