对+(void)initialize和+(void)load方法的理解

1.initliaize了解。(系统认识,类方法,只调用一次)

调用时机:在此类接受第一个消息时调用

父类子类的调用关系:父类和子类中都会调用,先调用父类,在调用子类。(子类中为实现会调用父类的隐式的调用父类的方法来初始化子类)

父类和本类的调用关系:调用分类中的实现,忽略本类中的实现(不会都调用)

实例:

@interface Person:NSObject

@end

@implementation Person

+(void)initialize{

    NSLog(@"%s",__FUNCTION__);

}

@end


@interface Student:Person


@end

@implementation Student

//1.不实现


/*

//1.显示的调用父类的

+(void)initialize{

    [super initialize];

}

*/


//2.实现自己的方法

+ (void)initialize{

    NSLog(@"%s",__FUNCTION__);

}

@end


@interface Student (love)


@end


@implementation Student (love)

//3.当在父类中实现initialize方法

+ (void)initialize{

    NSLog(@"%s",__FUNCTION__);

}

@end


@interface ViewController ()

@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    

    /*

    //1.//当不实现,或者显示的调用父类的方法时,子类在initliaize中会调用一次父类的方法。

    Student *s1 = [[Student alloc] init];

    

     2018-01-15 11:09:10.759770+0800 initliaize和load[16694:1036233] +[Person initialize]

     2018-01-15 11:09:10.759923+0800 initliaize和load[16694:1036233] +[Person initialize]

    */

    

    /*

    //2.当实现了自己类中的方法时,先调用父类的实现,在调用子类中实现(这与oc对象的初始化顺序有关,oc对对象的初始化是先父类,再子类)

    Student *s1 = [[Student alloc] init];

    //2018-01-15 11:36:26.414407+0800 initliaize和load[16974:1080382] +[Person initialize]

    //2018-01-15 11:36:26.414521+0800 initliaize和load[16974:1080382] +[Student initialize]

    */

    

    

    /*

    //3.当分类中实现initliaize方法时,在初始化此类的时候,只会调用此类中分类的方法,而忽略本类中的实现。

    Student *s1 = [[Student alloc] init];

    //2018-01-15 11:46:32.080362+0800 initliaize和load[17069:1098190] +[Person initialize]

    //2018-01-15 11:46:32.080494+0800 initliaize和load[17069:1098190] +[Student(love) initialize]

    */

    

    

    //4.再次实例化或者对这个对象发消息时,不会再调用initliaize方法了(这个方法只调用一次,其实我们可以把这个方法理解成类的初始化方法)

    /*

     再次实例化的时候得到的结果和单独实例化s1的结果是一样的,

     这是个类方法只会在此类接受第一个消息之前调用一次,(有人说父类的方法调用了两次,但是是因为我们再子类中没有实现或者显示的调用了父类的方法,所以子类中的调用去掉用了父类的方法,实际的情况是子类接受了第一个消息之前调用了一次子类的initliaize方法,父类被触发接受了第一个消息,调用了一次自己的initliaize方法。)

     */

}


2.+(void)load理解:(系统认识:也是类方法,只在runtime调用一次)

调用时机:在APP运行时调用。

父类和子类的调用:那个类实现了就调用那个类的,顺序是先调用父类,再子类,两者没有直接关系。

分类和本类的关系:都会调用(顺序是先本类,再分类)

实例:

@interface Person:NSObject


@end

@implementation Person

+ (void)load{

    NSLog(@"%s",__FUNCTION__);

}

@end


@interface Student:Person


@end

@implementation Student

//1.子类中未实现


//2.子类中实现了

+ (void)load{

    NSLog(@"%s",__FUNCTION__);

}


@end


@interface Student (love)


@end


@implementation Student (love)


//3.分类中实现了

+ (void)load{

    NSLog(@"%s",__FUNCTION__);

}


@end


@interface ViewController ()

@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    

    /*

    //1.子类中未实现(load)方法,不会沿用父类的(就是说,本类中没有实现,在本类中就不会调用,只会初始化父类的时候调用父类的)

     2018-01-15 14:15:09.707632+0800 initliaize和load[18101:1198007] +[Person load]

    */

    

    /*

    //2.子类中实现了。就先调用父类再子类

    2018-01-15 14:16:24.727876+0800 initliaize和load[18131:1200687] +[Person load]

    2018-01-15 14:16:24.728594+0800 initliaize和load[18131:1200687] +[Student load]

     */

    

    /*

     //3.分类中实现了,都会调用,顺序是本类后分类

     2018-01-15 14:22:57.415810+0800 initliaize和load[18209:1212252] +[Person load]

     2018-01-15 14:22:57.416510+0800 initliaize和load[18209:1212252] +[Student load]

     2018-01-15 14:22:57.416700+0800 initliaize和load[18209:1212252] +[Student(love) load]

     */

    

}


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值