方法调用时机

相同点: 程序启动都只会执行仅且一次,再次怎么调用使用类都不会执行了.

不同点: 方法调用时机不一样.

> + load程序启动类加载时就会调用,不管该类是否有使用或有Import都会执行

> + initialize 程序启动后,只有类使用时都会触发,包括调用类的类方法或对象方法; 包括该类的创建对象,创建对象在调用类方法alloc, 比如:[Drvier class]同样会触发

 

测试实例

有一个ViewController,

.touchesBegan,触发Car的类方法和对象方法

.点击其中一个按钮跳转至ViewControllerSecond控制器

touchesBegan:

// 交换类方法
    Method run1 = class_getClassMethod([Car class], @selector(run1));
    Method play1 = class_getClassMethod([Car class], @selector(play1));
    method_exchangeImplementations(play1, run1);
    [Car run1];
    [Car play1];
    
    Car *car = [[Car alloc] init];
    [car run];
    [car play];
    
    // 交换对象方法
    Method run = class_getInstanceMethod([Car class], @selector(run));
    Method play = class_getInstanceMethod([Car class], @selector(play));
    method_exchangeImplementations(play, run);
    
    [car run];
    [car play];
    
    Car *car2 = [[Car alloc] init];
    [car2 run];
    [car2 play];
    
    [Car run1];
    [Car play1];

 

程序启动后控制台打印

2017-09-09 17:09:33.865 Runtime[9060:228475] +[ViewControllerBase load]
2017-09-09 17:09:33.866 Runtime[9060:228475] +[ViewControllerSecond load]
2017-09-09 17:09:33.867 Runtime[9060:228475] +[ViewController load]
2017-09-09 17:09:33.867 Runtime[9060:228475] +[Driver load]
2017-09-09 17:09:33.867 Runtime[9060:228475] +[Car load]
2017-09-09 17:09:33.921 Runtime[9060:228475] +[ViewControllerBase initialize]
2017-09-09 17:09:33.922 Runtime[9060:228475] +[ViewController initialize]

touches后Car的initialize会调用:

+[Car initialize]

点击按钮后:

+[ViewControllerSecond initialize]

 返回ViewControllerSecond,再次跳转至ViewControllerSecond initialize不会调用了

 

应用:

+ load: .比如使用runtime交换方法实现时,可以在此方法中处理; 

+ initialize: .类使用时可以初始化类的一些基础数据;  

 

posted on 2017-09-09 17:13  HJiang  阅读(389)  评论(0编辑  收藏  举报