2012-07-21 4 views
0

저는이 사이트를 처음 접했기 때문에 컨벤션이 질문하는 방법에 대해 무엇인지 모르지만 Objective-C로 시작하고 객체의 인스턴스 생성과 관련된 질문이 있습니다.목표 C alloc 메서드의 논리?

좋아요, 그래서 루트 클래스 NSObject에는 클래스 메소드 alloc과 init이 있으며,이 메소드는 거의 모든 클래스 인 NSObject를 상속받은 모든 클래스에 전달됩니다. 나는 객체를 인스턴스화의 일반적인 형식은 다음과 같이 알고 :

MyObject *m = [[MyObject alloc]init];

그러나 MyObject를 고려하는 것은 NSObject의에서 상속 ALLOC 및 초기화 방법, 이것은 또한 이론적으로 MyObject를하고 NSObject의이 같은 ALLOC이 점을 고려, 일할 수있다

MyObject *m = [[NSObject alloc] init];

을 그리고 그것은 단지 인스턴스 작동,하지만 난을 MyObject 클래스의 메서드를 호출하려고 할 때, NSException가 발생 : 및 초기화 방법 (클래스를 오버라이드 (override)하지 않는 가정). NSObject 할당을 다시 MyObject alloc으로 전환하면 작동합니다. 나는 그 이유를 이해하지 못한다! 이것은 아마도 기본적인 질문 일뿐입니다.

미리 감사드립니다.

제이크

+0

던져진 예외는 무엇입니까? –

+0

@NSArray NSInvalidArgumentException 인 것 같습니다. 인스턴스로 보낸 인식 할 수없는 선택기 (인스턴스의 16 진수 주소) –

답변

2
[[NSObject alloc] init] 

NSObject의, 다른 타입의 변수에 할당, 그래서 MyClass *obj = [[MySubClass alloc ] init]; 같은 것을 할 의미가 있습니다하면서, MyObject *m = [[NSObject alloc] init];을 훨씬 이해가되지 않는 경우에 상관없이 생성 MySubClass는 MyClass이기도합니다.

3

로직은 동일하지만 메시지 구현에 전달 된 클래스 객체는 alloc이 아닙니다. 첫 번째 경우, 컴파일러로 코드 변환 :

objc_msgSend([MyObject class], @selector(alloc)]; 

따라서 ALLOC 구현 MyObject 클래스의 인스턴스를 생성한다. 당신이 [NSObject alloc];을 작성하는 경우 그러나, 그것은 분명 클래스 '메시지에 응답하지 않습니다 그래서 일반 NSObject의 인스턴스가 생성됩니다

objc_msgSend([NSObject class], @selector(alloc)]; 

로 변환된다.