다른 init ... 메소드를 통해 초기화 할 수있는 objective-c 클래스에서 모든 초기화 프로그램에 공통된 초기화 코드를 다른 init * 메소드에서 호출되는 하나의 공통 메소드로 수집하는 것이 상식입니다 (또는 때때로 awakeFromNib에서).objective-c에서 initializer 메서드를 명명하는 규칙이 있습니까?
이 메서드의 이름 지정 방법에 대한 규칙이 있습니까? 초기화 프로그램? initCommon? ...?
다른 init ... 메소드를 통해 초기화 할 수있는 objective-c 클래스에서 모든 초기화 프로그램에 공통된 초기화 코드를 다른 init * 메소드에서 호출되는 하나의 공통 메소드로 수집하는 것이 상식입니다 (또는 때때로 awakeFromNib에서).objective-c에서 initializer 메서드를 명명하는 규칙이 있습니까?
이 메서드의 이름 지정 방법에 대한 규칙이 있습니까? 초기화 프로그램? initCommon? ...?
애플에 따르면, 초기화 방법은 항상 단어로 시작해야합니다 이름 다음에 '초기화' ' 인수를 설명하는 구성 요소. 클래스에 둘 이상의 초기화 프로그램이있는 경우 메서드 중 하나만 모든 작업을 수행하고 다른 메서드는 누락 된 인수에 대한 기본값을 제공해야합니다.
- (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;
}
지정된 초기화 프로그램을 설명하는 것처럼 들립니다. 다른 초기화 프로그램과는 다른 특수한 명명 규칙이 없습니다. 일반적으로 초기화 프로그램은 "init"로 시작합니다.
나는 일반적으로 기본 - (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;
}
이것은 사용자가해야하는 것과 반대입니다.가장 긴 초기화 프로그램이 지정된 초기화 프로그램이라고 가정합니다. 누군가 여러분의 클래스를 서브 클래스 화하고'- (id) init' 메소드를 덮어 쓰면'[super initWithValue : x]'를 호출하여'-init'에 넣은 코드가 결코 호출되지 않도록 할 것입니다. – kubi
서브 클래스에 클래스를 사용할 수있는 경우,'[super init]'를 호출하지 않으면'init' 메소드를 오버라이드해서는 안된다는 것을 문서화하십시오. 아무도 가정해서는 안됩니다. – dreamlax
@Martin Cote : 또한 객체가 할당 될 때 모든 인스턴스 변수가 0이되므로 모든 인스턴스 변수에 0 또는'nil '을 할당 할 필요가 없습니다. – dreamlax
이 방법은 "designated initializer을"라고합니다. 애플은에 꽤 좋은 문서를 가지고,하지만 요약 :
는 지정된 초기화 잘 문서화되어야한다[super init...]
[super init]
만 지정된 초기화 프로그램 내에서 호출하면 다른 모든 init 메소드가 초기화 메소드를 호출해야합니다.
Apple 문서에서는'[super init]'의 반환 값을'self'에 지정하고'self'가 nil이 아님을 확인하기를 권장합니다. 나는 또한'init' 메소드 내에서 액세서 메소드를 사용하지 않는 것에 대해 막연하게 기억하고 있습니다. – dreamlax