1.+load
+load方法在类加载到系统的时候调用
+load方法调用的时候尚未有自动释放池,所以如果+load中的内容使用到了自动释放池,则代码需要用@autoreleasepool{}包含。 另外,对应Category中的+load方法并不会覆盖类自身中的+load方法,两个+load方法都会调用,而且Category的+load方法在类自身的+load方法之后调用。
2 +initialize
+initialize方法在一个比较安全的环境中调用,比+load更适合放入初始化代码。+initialize方法在类首次收到消息时调用,若此类一直没有使用,则+initialize就不会调用。 与+load方法类似的时,在向子类发送initialize消息前,总是会先向父类发送initialize消息,如果父类尚未调用+initialize方法则调
Category中的+initialize方法会覆盖类本身的+initialize方法。如果父类中实现了+initialize方法,而子类中没有重写此方法,则子类初始化时就会使用父类的方法
3-init
-init方法用于初始化实例对象,
4. alloc+init <————> new
源码:
+ new
{
id newObject = (*_alloc)((Class)self, 0);
Class metaClass = self->isa;
if (class_getVersion(metaClass) > 1)
return [newObject init];
else
return newObject;
}
+ alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone());
}
- init
{
return self;
}
三个方法的执行顺序:
1.使用实例方法
直接上代码:
@interface Father : NSObject
+(void)hello;
@end
@interface Son : Father
+(void)hello;
-(void)good;
@end
@implementation Father
+(void)initialize
{
NSLog(@"father initialize %s",__FUNCTION__);
}
+(void)hello
{
NSLog(@"father say hello %s",__FUNCTION__);
}
-(instancetype)init
{
if (self==[super init]) {
NSLog(@"father initialize %s",__FUNCTION__);
}
return self;
}
+(void)load
{
NSLog(@"father say load %s",__FUNCTION__);
}
@end
@implementation Son
+(void)initialize
{
NSLog(@"son initialize %s",__FUNCTION__);
}
+(void)hello
{
NSLog(@"son say hello %s",__FUNCTION__);
}
+(void)load
{
NSLog(@"son say load %s",__FUNCTION__);
}
-(instancetype)init
{
if (self==[super init]) {
NSLog(@"son initialize %s",__FUNCTION__);
}
return self;
}
-(void)good
{
NSLog(@"son say good %s",__FUNCTION__);
}
@end
@interface Son(Category)
@end
@implementation Son (Category)
+(void)load
{
NSLog(@"sonCategory say load %s",__FUNCTION__);
}
-(void)goodbye
{
NSLog(@"sonCategory say goodbye %s",__FUNCTION__);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
// [Father hello];
// [Son hello];
// [[[Son alloc]init]good];
// [Son hello];
[[[Son alloc]init]goodbye];
}
return 0;
}
father say load +[Father load]
son say load +[Son load]
sonCategory say load +[Son(Category) load]
father initialize +[Father initialize]
son initialize +[Son initialize]
father initialize -[Father init]
son initialize -[Son init]
sonCategory say goodbye -[Son(Category) goodbye]