2013-03-19 2 views
30

내 초기보기 컨트롤러가로드되어 있고 awakeFromNib 메서드 또는 initWithCoder: 메서드에서이 작업을 처리해야합니까? NSArray가 init'd가되어야합니다. awakeFromNib는 아무것도 돌려 줄 필요가 없기 때문에 더 잘 작동하는 것처럼 보입니다.하지만 nib 파일은 올바르게 사용되던 것처럼 작동합니다. 나는 곧 깨질 방법을 사용하고 싶지 않다.여기서 awakeFromNib 또는 initWithCoder를 사용해야합니까?

그리고 initWithCoder:처럼 보일 것이다

- (id)initWithCoder:(NSCoder *)decoder { 
    if (self = [super initWithCoder:decoder]) { 
     self.articles = [[NSMutableArray alloc] init]; 
    } 

    return self; 
} 

답변

38

-awakeFromNib의 요점은 그래서 당신이 펜촉에서 다른 개체에 대한 모든 연결이 설정되어 있는지 확인 할 수 있습니다 때 초기화 물건을 할 수 있다는 것입니다.

펜촉 로딩 인프라는 펜촉 아카이브에서 다시 각 객체에로 awakeFromNib 메시지를 전송하지만 에있는 모든 오브젝트 후 아카이브가로드되고 초기화되었다. 객체가 awakeFromNib 메시지를 수신하면 모든 콘센트와 동작 연결이 이미 설정되어있는 것이 보장됩니다.

super을 잊지 마십시오.

언제든지 곧 사라지지 않을 것입니다. 코드를 너무 많이 사용하면 전환 기간이 길어질 수 있습니다. 예, 그 이름은 이전의 "nib"파일 형식에서 왔지만 this stack overflow question은 파일 확장자의 차이점을 제거합니다.

요약하면 클래스의 내부 인스턴스 변수를 설정할 때 두 방법 중 하나를 사용할 수 있습니다. init 메서드 (-initWithCoder 포함) 안에는 setter가 완전히 초기화되는 클래스에 의존하는 경우에 setter 메서드를 사용하는 것이 안전하지 않을 수 있습니다 (소스 WWDC 2012 비디오는 현대 objective-c로 이동 함). 예는 nib 파일의 다른 객체를 참조하는 속성을 설정하는 것입니다.

UIViewController 하위 클래스 -initWithCoder은 스토리 보드에서로드 할 때만 호출됩니다. 스토리 보드를 사용하든 사용하지 않든간에 -awakeFromNib이 호출되므로 사용하지 않는 것이 좋습니다.

당신이 고려할 수 있습니다 또 다른 패턴은 게으른 게터입니다 :

-(NSMutableArray *)articles{ 
    if (_articles){ 
     return _articles; 
    } 
    _articles = [[NSMutableArray alloc] init]; 
    return _articles; 
} 

이 방법의 장점은 배열에 추가 설정을하고 싶다면 당신이하지 않을 때 쉽게 배열을 폐기 할 수 있다는 것입니다 더 이상 필요 없으며 다음번에 부동산에 액세스 할 때 다시 새로운 것이 있습니다.

+1

좋은데,'-initWithCoder :'는 UIViewController에서 호출되지 않습니다. – CodaFi

+4

Storyboard에서 인스턴스화 된 UIViewController 하위 클래스의'initWithCoder' 메서드에 중단 점을 넣었습니다. 디버거가 중단 점에 도달했습니다. [문서] (http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html#//apple_ref/doc/uid/TP40007457-CH10)이 동작을 확인합니다. – Jeff

+0

스토리 보드에서로드 할 때'-awakeFromNib'도 표시됩니다. – jackslash

관련 문제