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
方法,则无论您的进程是否对该类进行任何其他使用。
您可以看到运行时如何在of中将load
方法作为特例查找,并直接从in 中调用它。_class_getLoadMethod
objc-runtime-new.mm
call_class_loads
objc-loadmethod.mm
运行时还运行load
它加载的每个类别的方法,即使同一类上的多个类别实现load
. 这是不寻常的。通常,如果两个类别在同一个类上定义了相同的方法,则其中一个方法将“获胜”并被使用,而另一个方法将永远不会被调用。
initialize
方法_
运行时initialize
在将第一条消息(除了load
or 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 周五关于此主题的问答。