2010-02-11 5 views
3

다른 init ... 메소드를 통해 초기화 할 수있는 objective-c 클래스에서 모든 초기화 프로그램에 공통된 초기화 코드를 다른 init * 메소드에서 호출되는 하나의 공통 메소드로 수집하는 것이 상식입니다 (또는 때때로 awakeFromNib에서).objective-c에서 initializer 메서드를 명명하는 규칙이 있습니까?

이 메서드의 이름 지정 방법에 대한 규칙이 있습니까? 초기화 프로그램? initCommon? ...?

답변

5

애플에 따르면, 초기화 방법은 항상 단어로 시작해야합니다 이름 다음에 '초기화' ' 인수를 설명하는 구성 요소. 클래스에 둘 이상의 초기화 프로그램이있는 경우 메서드 중 하나만 모든 작업을 수행하고 다른 메서드는 누락 된 인수에 대한 기본값을 제공해야합니다.

- (id)init 
{ 
    return [self initWithFirstName:nil 
          lastName:nil]; 
} 

- (id)initWithFirstName:(NSString *)firstName 
       lastName:(NSString *)lastName 
{ 
    return [self initWithFirstName:firstName 
          lastName:lastName 
           age:nil]; 
} 

- (id)initWithFirstName:(NSString *)firstName 
       lastName:(NSString *)lastName 
        age:(NSNumber *)age 
{ 
    [super init]; 

    self.firstName = firstName; 
    self.lastName = lastName; 
    self.age = age; 

    return self; 
} 

UPDATE

@dreamlax가 지적 하듯이, 애플의 설명서를 권장합니다 (그리고 ARC 컴파일 :

그래서 예를 들어, Person 클래스는 다음 초기화 ... 방법이있을 수 있습니다 , 컴파일러가 필요함) [super init] 호출의 반환 값으로 self을 다시 할당합니다.

워드 프로세서는 또한 [super init] 반환 nil, self에 대한 호출이 이미 시간에 호출이 반환을 해제했을 경우 때문입니다 더 이상의 초기화를 수행하기 전에 nil 확인하는 것이 좋습니다, 그래서 더 이상 초기화하는 인스턴스가 없을 것이다.

Apple 설명서에는 init... 메서드의 접근 자 메서드에 대한 호출을 피할 것을 제안합니다. 대신 인스턴스 변수를 직접 설정하는 것이 좋습니다. 그래서 위의 initWithFirstName:lastName:age: 방법은 이상적으로 다음 예제와 유사한 방식으로 작성해야합니다

- (id)initWithFirstName:(NSString *)firstName 
       lastName:(NSString *)lastName 
        age:(NSNumber *)age 
{ 
    self = [super init]; 

    if (self == nil) return nil; 

    _firstName = [firstName copy]; 
    _self.lastName = [lastName copy]; 
    _age = [age copy]; 

    return self; 
} 
+0

Apple 문서에서는'[super init]'의 반환 값을'self'에 지정하고'self'가 nil이 아님을 확인하기를 권장합니다. 나는 또한'init' 메소드 내에서 액세서 메소드를 사용하지 않는 것에 대해 막연하게 기억하고 있습니다. – dreamlax

1

지정된 초기화 프로그램을 설명하는 것처럼 들립니다. 다른 초기화 프로그램과는 다른 특수한 명명 규칙이 없습니다. 일반적으로 초기화 프로그램은 "init"로 시작합니다.

0

나는 일반적으로 기본 - (id)init 방법에서 모든 것을 초기화하고 다른 초기화 방법에서 하나 전화 :

- (id)init 
{ 
    if(self = [super init]) 
    { 
     myValue = 0.0f; 
     myOtherValue = 0.0f; 
    } 
    return self; 
} 

- (id)initWithValue:(float)value 
{ 
    if(self = [self init]) // Calling the other init method (not [super init]) 
    { 
     myValue = value; 
    } 
    return self; 
} 
+2

이것은 사용자가해야하는 것과 반대입니다.가장 긴 초기화 프로그램이 지정된 초기화 프로그램이라고 가정합니다. 누군가 여러분의 클래스를 서브 클래스 화하고'- (id) init' 메소드를 덮어 쓰면'[super initWithValue : x]'를 호출하여'-init'에 넣은 코드가 결코 호출되지 않도록 할 것입니다. – kubi

+0

서브 클래스에 클래스를 사용할 수있는 경우,'[super init]'를 호출하지 않으면'init' 메소드를 오버라이드해서는 안된다는 것을 문서화하십시오. 아무도 가정해서는 안됩니다. – dreamlax

+1

@Martin Cote : 또한 객체가 할당 될 때 모든 인스턴스 변수가 0이되므로 모든 인스턴스 변수에 0 또는'nil '을 할당 할 필요가 없습니다. – dreamlax

2

이 방법은 "designated initializer을"라고합니다. 애플은에 꽤 좋은 문서를 가지고,하지만 요약 :

는 지정된 초기화 잘 문서화되어야한다
  1. , 코드를 하위 클래스 사람은 [super init...]
  2. 지정 초기화를 사용하여 호출 할 필요가있는 초기화 알 필요가있다 항상 대부분의 인수를 가진 초기화 프로그램입니다 ... 항상 그래야하므로 조심하세요.
  3. [super init] 만 지정된 초기화 프로그램 내에서 호출하면 다른 모든 init 메소드가 초기화 메소드를 호출해야합니다.
관련 문제