方法调用时机
相同点: 程序启动都只会执行仅且一次,再次怎么调用使用类都不会执行了.
不同点: 方法调用时机不一样.
> + 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: .类使用时可以初始化类的一些基础数据;