OC中initialize&& load && init方法

来源:互联网 发布:ubuntu停止当前命令 编辑:程序博客网 时间:2024/05/22 15:51

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__);}@endint 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]

0 0
原创粉丝点击