2013-02-22 2 views
3

Apple's docs에 지정된 초기화 프로그램의 일부 정보를 찾았지만 이해할 수없는 것은 각 클래스에 반드시 과 하나만 있습니다 지정된 초기화 프로그램이 있습니까? 예를 들어Objective-C 클래스에는 정확히 하나의 지정된 초기화 프로그램이 있어야합니까?

, 무엇 class Bclass A에서 상속하고 initX, initY, initZ있는 동안 class AinitL, initM, initN이있는 경우. initX 전화 번호 [super initL]initY 전화 번호는 [super initM]이고 initZ 전화 번호는 [super initN]입니다. 우리가 3 차 초기화하고, 각각의 발신자를 가질 수 없습니다, 대신 모든 "보조 초기화 '의이다

는 지정 초기화를 호출하고 initFoo는 슈퍼 클래스의 지정된 초기화 여기서 각 지정된 초기화는 [super initFoo]를 호출합니다 상응하는 슈퍼 클래스의 3 가지 기본 초기화 프로그램? (이들 모두는 NSObject에서 상속 받고 단지 self = [super init]이라고 부릅니다.)

답변

4

아니요, obj-c 클래스에는 지정된 여러 이니셜 라이저가있을 수 있습니다. 가장 일반적인 예는 -initWithCoder:-init입니다. 전자는 객체를 보관 해제 할 때 사용되며 후자는 다른 모든 초기화에 사용됩니다.

그런데 일반적으로 -initWithCoder: 외부에 지정된 초기화 도구 하나만있는 것이 좋습니다. 이는 코드 중복을 방지하고 모든 초기화에 대해 호출되기를 원할 경우 서브 클래스가 대체해야하는 메소드를 분명히합니다. 그러나 3 개의 별개의 지정된 초기화 프로그램을 필요로하는 좋은 사례가 있다면, 그 일을 막을 수있는 방법은 없습니다. 올바르게 문서화하십시오.

+0

NSCell에는 [docs] (https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSCell_Class/Reference/NSCell)에 따라 네 개의 지정된 초기화 프로그램이 있습니다. html % 23 // apple_ref/doc/uid/TP40004017) :'init','initWithCoder :','initTextCell :','initImageCell :'. – Monolo

+0

@Monolo :'initTextCell :'과'initImageCell :'아마도'[self init]'을 호출한다. –

+0

동의하지만, 문서는 명시 적으로 이니셜 라이저로 명시한다. 나는 그것이 문서의 버그인지 항상 궁금해했다. – Monolo

2

지정된 초기화 프로그램은 재귀 호출을 방지하고 중요한 기본 클래스 초기화를 생략하는 데 도움이되는 개념입니다. 지정된 이니셜 라이저 규칙을 따르지 않고 여전히 작업 클래스 계층 구조를 만들 수 있습니다.

실제로 순수 지정에서 벗어난 패턴이 초기화됩니다. 예를 들어 NSCoding은 initWithCoder:을 사용하여 객체를 초기화해야하지만 다른 초기화 프로그램을 사용하여 코드에서 객체를 초기화 할 수 있습니다.

관련 문제