方法調用時機
相同點: 程序啟動都只會執行僅且一次,再次怎么調用使用類都不會執行了.
不同點: 方法調用時機不一樣.
> + 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: .類使用時可以初始化類的一些基礎數據;
浙公網安備 33010602011771號