+initalize
처음으로 또는 클래스의 하위 클래스 중 하나가 처음으로 메시지를 수신하면 클래스로 전송됩니다. 그래서, 당신은 수행 할 때 alloc
메시지가 initialize
를 트리거
instance = [[[YourClass alloc] init] autorelease];
있다. 서브 클래스와 같은 일을 할 경우
는 : alloc
메시지가 +[YourClass initialize]
다른 하나는했던 것과 같은 방식으로 트리거
instance = [[[SubclassOfYourClass alloc] init] autorelease];
그건 (사전도 +[SubclassOfYourClass initialize]
을 유발하는 있지만 이들 중 하나는 - 그것을 할 것입니다. 각 클래스의 initialize
번 이상 호출되지 없구요. (당신이 [super initialize]
또는 [SomeClass initialize]
자신을 호출하지 않는 한 방법이 그것을 기대되지 않기 때문에 - 그래서는 그렇게하지 않습니다.)
-init
, 다른 한편으로는, 초기화하다 새로운 인스턴스. 표현식 [[YourClass alloc] init]
에서 직접 인스턴스에 직접 메시지를 보냅니다. 다른 이니셜 라이저 ([[YourClass alloc] initWithSomethingElse:bar]
) 또는 편의 팩토리 ([YourClass instance]
)를 통해 간접적으로 호출 할 수도 있습니다.
initialize
과 달리 항상 init
(또는 적절한 경우 다른 초기화 도구)을 수퍼 클래스에 보내야합니다. (Wil Shipley doesn't assign to self
at all를이 방법 또는 슈퍼 클래스의 또는 두 인수를 취할 수 있으며, 어떤 사람들은 한 줄에 self = [super init]
을 선호하고)
- (id) init {
if ((self = [super init])) {
framistan = [[Framistan alloc] init];
}
return self;
}
세부 사항은 다르지만, 기본적인 아이디어는 동일합니다 : 대부분의 초기화 방법은 다음과 같이 대략 볼 : [super init[WithSomething:…]]
을 호출하고 nil
을 반환하지 않았는지 확인하고 인스턴스가 설정되지 않은 경우 인스턴스를 설정 한 다음 수퍼 클래스가 반환 한 값을 반환합니다.
즉, 은 nil
을 init
에서 반환 할 수 있습니다. 이렇게하면 실패한 개체가 누출되지 않도록 [self release]
을 실행해야합니다. (유효하지 않은 인수 값을 검출하기위한 대안은 어설 션이 실패 할 경우. 각각의 상대적인 장점이 질문의 범위를 벗어난 예외가 발생 NSParameterAssert
입니다.)
내가 인스턴스를 만들려면이 사용 방법 내 인터페이스를 구성하는 인스턴스 변수가있는 AppController?
가장 좋은 방법은 main
에 모든 것을 할 것입니다 :
int main(int argc, char **argv) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
AppController *controller = [[[AppController alloc] init] autorelease];
[[NSApplication sharedApplication] setDelegate:controller]; //Assuming you want it as your app delegate, which is likely
int status = NSApplicationMain(argc, argv);
[pool drain];
return status;
}
당신은 AppController
에서 응용 프로그램의 대리자 메서드의 다른 셋업을 할 수 있습니다.
당신은 이미 이것을 알고 있습니다 만, 이것을 읽는 다른 사람에게는 : 님은 친구입니다. Interface Builder는 당신의 친구입니다. 프레임 워크와 싸우지 마십시오. 그래픽 작업을 통해 인터페이스를 구축하십시오. 그러면 응용 프로그램이보다 효과적으로 작동합니다.
덕분에 도움이되었지만 IB가 꽤 많이하는 것처럼 보입니다. AppController에서 load interface라는 메서드를 만들고 main에서 호출했습니다. AppController * controller = [...] [컨트롤러 loadInterface]; 나는 (주석 계속) 내 컨트롤러 변수 MainWindow를에 값을 할당 할 때 ... – cemulate
나는 콘솔 오류를 얻을 : _NXCreateWindow : 오류 설정 창 속성 (1002) _NSSetWindowTag, 오류 삭제 창 태그 (1002) _NSSetWindowTag를 , 오류 설정 창 태그 (1002) 이 문제를 해결할 수 있습니까? – cemulate
윈도우를 만들기 전에 NSApplication을 실행시켜야합니다. 그렇기 때문에 컨트롤러를 응용 프로그램 위임자로 만들고 위임 메서드로 창을 만들거나로드하는 것이 좋습니다. (명령 행 응용 프로그램 *은 아직 NSApplication을 실행하지 않았기 때문에 창을 작성할 수 없습니다.) –