load
메시지
런타임은 load
클래스 개체가 프로세스의 주소 공간에로드 된 직후에 각 클래스 개체에 메시지를 보냅니다 . 프로그램 실행 파일의 일부인 클래스의 경우 런타임은 load
프로세스 수명 초기에 메시지를 보냅니다 . 공유 (동적으로로드 된) 라이브러리에있는 클래스의 경우 런타임은 공유 라이브러리가 프로세스의 주소 공간에로드 된 직후로드 메시지를 보냅니다.
또한 런타임은 load
해당 클래스 객체 자체가 load
메서드를 구현하는 경우 에만 클래스 객체로 전송 합니다 . 예:
@interface Superclass : NSObject
@end
@interface Subclass : Superclass
@end
@implementation Superclass
+ (void)load {
NSLog(@"in Superclass load");
}
@end
@implementation Subclass
// ... load not implemented in this class
@end
런타임은 load
메시지를 Superclass
클래스 객체 로 보냅니다 . 그것은 않습니다 하지 보내고 load
받는 메시지 Subclass
에도 불구하고, 클래스 객체 Subclass
상속의 방법 Superclass
.
런타임은 클래스의 모든 수퍼 클래스 객체 (이 수퍼 클래스 객체가 구현하는 경우 )와 사용자가 링크 한 공유 라이브러리의 모든 클래스 객체에 메시지를 load
보낸 후 클래스 객체에 메시지를 보냅니다 . 그러나 자신의 실행 파일에서 어떤 다른 클래스가 아직 수신되었는지 알 수 없습니다 .load
load
load
프로세스가 주소 공간에로드하는 모든 클래스는 프로세스가 클래스를 다른 용도로 사용하는지 여부에 관계없이 메소드를 load
구현하면 메시지 를 수신합니다 load
.
당신은 런타임이 조회하는 방법을 볼 수 있습니다 load
의 특별한 경우로 방법 _class_getLoadMethod
의 objc-runtime-new.mm
, 그리고에서 직접 호출 call_class_loads
에 objc-loadmethod.mm
.
런타임 load
은 동일한 클래스의 여러 카테고리가 .NET Framework를 구현하더라도로드하는 모든 카테고리 의 메소드를 실행합니다 load
. 이것은 드문 일입니다. 일반적으로 두 범주가 동일한 클래스에서 동일한 메서드를 정의하면 메서드 중 하나가 "승리"하여 사용되고 다른 메서드는 호출되지 않습니다.
initialize
방법
런타임 은 클래스 객체 또는 클래스의 인스턴스에 initialize
첫 번째 메시지 ( load
또는 initialize
제외)를 보내기 직전에 클래스 객체 의 메서드를 호출합니다 . 이 메시지는 일반 메커니즘을 사용하여 전송되므로 클래스 initialize
가을 구현하지 않지만 구현 하는 클래스에서 상속하면 클래스가 수퍼 클래스의 initialize
. 런타임은 initialize
먼저 클래스의 모든 슈퍼 클래스에를 보냅니다 (슈퍼 클래스가 아직 전송되지 않은 경우 initialize
).
예:
@interface Superclass : NSObject
@end
@interface Subclass : Superclass
@end
@implementation Superclass
+ (void)initialize {
NSLog(@"in Superclass initialize; self = %@", self);
}
@end
@implementation Subclass
// ... initialize not implemented in this class
@end
int main(int argc, char *argv[]) {
@autoreleasepool {
Subclass *object = [[Subclass alloc] init];
}
return 0;
}
이 프로그램은 두 줄의 출력을 인쇄합니다.
2012-11-10 16:18:38.984 testApp[7498:c07] in Superclass initialize; self = Superclass
2012-11-10 16:18:38.987 testApp[7498:c07] in Superclass initialize; self = Subclass
시스템이 initialize
메소드를 느리게 전송하기 때문에 프로그램이 실제로 메시지를 클래스 (또는 하위 클래스 또는 클래스 또는 하위 클래스의 인스턴스)로 보내지 않는 한 클래스는 메시지를받지 않습니다. 그리고 당신이를받을 때까지 initialize
, 당신의 과정에있는 모든 수업은 이미 load
(적절하다면) 받았을 것 입니다.
구현하는 표준 방법 initialize
은 다음과 같습니다.
@implementation Someclass
+ (void)initialize {
if (self == [Someclass class]) {
// do whatever
}
}
이 패턴의 요점은 Someclass
구현하지 않는 하위 클래스가있을 때 자체적으로 다시 초기화 되는 것을 방지 하는 것 initialize
입니다.
런타임은의 함수에 initialize
메시지를 보냅니다 . 보내는 데 사용 하는 것을 알 수 있는데 , 이는 일반적인 메시지 전송 기능입니다. _class_initialize
objc-initialize.mm
objc_msgSend
추가 읽기
이 주제에 대한 Mike Ash의 금요일 Q & A 를 확인하십시오 .
+load
범주에 대해 개별적으로 전송됩니다; 즉, 클래스의 모든 범주에는 자체+load
메서드 가 포함될 수 있습니다 .