2013-08-15 4 views
2

f와 [[super allocWithZone : nil] init]을 호출합니다. f. 이자형. (단지 더 명확한 메시지 메커니즘을 이해하기위한) 나는 클래스메시징 메커니즘

에서 MyClass.h이

@interface MyClass : NSObject { 
    int ivar1; 
    int ivar2; 
} 

+ (id)instance; 

@end 

MyClass.m

[super allocWithZone:nil]를 호출 할 때 실제로 objc_msgSend에 전송됩니다 무엇
static MyClass* volatile _sInstance = nil; 

@implementation MyClass 

+ (id)instance { 
     if (!_sInstance) { 
     @synchronized(self) { 
      if (!_sInstance) { 
       _sInstance = [[super allocWithZone:nil] init]; 
      } 
     } 
    } 
    return _sInstance; 
} 

@end 

?

objc_msgSend([MyClass class], "allocWithZone", nil) 또는 objc_msgSend([NSObject class], "allocWithZone", nil)? 실제로

나는 objc_msgSend(self, "allocWithZone", nil)라고 생각하고이 경우 self == [MyClass class];

에 나는 ivar1 동안 그 기억해야 할 및 ivar2이 할당됩니다.

클래스 메서드에서 super를 호출하면 objc_msgSend() 함수에서 "self"인수가 전달됩니다. 즉,이 경우에는 자식의 클래스 개체입니까? 그리고 allocWithZone은 자식 클래스 객체를 "보면서"ivar1과 ivar2에 할당되어야하는 메모리 양을 확인합니다.

감사합니다.

+0

아마도 [[MyClass super] alloc]'을 호출하여'MyClass'의 인스턴스를 할당하겠습니까? – trojanfoe

+0

@trojanfoe 그것은 "alloc"메쏘드가 될 수 있고, 그렇게 중요하지 않다.) – BergP

+0

하지만 [super alloc] (또는 [super allocWithZone]')을 호출하는 것이 어떻게 추가 공간을 위해 충분한 공간을 할당하는지 이해할 수 없다. 'self'의 인스턴스 변수? – trojanfoe

답변

3

super에 대한 메시지는 컴파일러에서 objc_msgSendSuper (아니요 : objc_msgSend)으로 번역됩니다. 첫 번째 인수는 구조체에 대한 포인터입니다. struct는 현재 구현의 수퍼 클래스에 대한 포인터와 수신기에 대한 포인터를 포함합니다. 전자는 재정의 된 구현을 검색하기 위해 런타임 중에 필요하며, 후자는 첫 번째 인수로 사용됩니다.

클래스 메서드의 경우 수신기는 다시 클래스 포인터이지만 super_class과 동일하지 않습니다. 귀하의 경우 수신자는 MyClass 포인터이고 super_class 포인터는 NSObject입니다.

두 개의 사이드 노트 : 가장 좋아하는 싱글 톤을 쓸 때 에너지를 사용하지 않는 것이 좋습니다. 자신의 인스턴스를 만들거나 제공된 공유 인스턴스를 사용하려면 개발자에게 맡기는 것이 좋습니다. 그리고 double-checked locking is broken에 유의하십시오.