2014-02-27 2 views
0

저는 Objective-C로 수년간 프로그래밍을 해왔습니다. 항상이 문제에 부딪 힙니다. 여러 개의 초기화 프로그램이있는 객체가 있지만 모두 공통적 인 코드가있는 경우 , 당신은 어떻게 그것을 추출합니까?Objective-C 용 공통 초기화 클래스

@implementation Example 

- (void)privateInitWithString:(NSString*)aString 
{ 
    self.str = aString; 
} 

- (id)init 
{ 
    self = [super initWithWindowNibName:@"MyNib"] 
    if(self) { 
    [self privateInitWithString:@""]; 
    } 
    return self; 
} 

- (id)initWithString:(NSString*)aString 
{ 
    self = [super initWithWindowNibName:@"MyNib"] 
    if(self) { 
    [self privateInitWithString:aString]; 
    } 
    return self; 
} 

@end 

중복 많은 코드 냄새 개별 초기화에 있습니다 :

내가 가지고 올 수 있었던 최선의이 같은 것입니다. 그러나 하나의 이니셜 라이저를 다른 하나에 "가져 오는"방법을 생각할 수 없습니다. 호출하기 전에 이 설정되어 있다는 보장이 없기 때문에 [super init]

이것이 가장 좋은 방법이 있습니까? ?

답변

4

하나를 "지정된 초기화 프로그램"이라고 쓰십시오. 이니셜 라이저는 모든 다른 상황을 처리합니다. 귀하의 경우에는 initWithString이 좋은 후보로 보인다. 그리고 초기화는 당신은 여기에 대한 자세한 내용을보실 수 있습니다

- (instancetype)init { return [self initWithString:@""]; } 

된다 :

https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html

+3

+1 기술적으로 정답, 당신은 * 여러 * 지정된 이니셜 라이저를 가질 수 시나리오 몇 가지가 있지만 예를 들어 클래스를 ''(또는 때로는 '')과 일치 시키면됩니다. –

+0

그것은 완벽합니다! 다음은 페이지 하단의 "다중 이니셜 라이저 및 지정된 초기화 프로그램"섹션에 대한 링크입니다. https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html# // apple_ref/doc/uid/TP40010810-CH6-SW3 – Paul