在前面, 我們知道了類的本質其實也是一個對象, 是Class類型, 那麼類的載入過程是如何的呢?? 其實類的載入過程非常簡單, 先載入父類然後再載入子類, 而且每一個類就只會載入一次, 下面讓我們來看看~
例子:
#import <Foundation/Foundation.h>@interface Person : NSObject+ (void)load;@end@implementation Person+ (void)load{ NSLog(@"Person-----load");}@end@interface Student : Person+ (void)load;@end@implementation Student+ (void)load{ NSLog(@"Student-----load");}@endint main(){ return 0;}
在main()函數裡, 並沒有調用所設定的類方法, load這個類方法是系統自動調用的, 所以不需要我們自行去調用.
結果:
2015-01-24 14:14:45.451 07-類的本質[10689:1160313] Person----load2015-01-24 14:14:45.452 07-類的本質[10689:1160313] Student----load
從結果, 我們就看的出來, 系統先載入Person, 然後再載入Student.
那如果我們需要監聽它是什麼時候載入呢? 還有一個方法叫做+ (void)initialize, 下面讓我們來看看:
#import <Foundation/Foundation.h>@interface Person : NSObject+ (void)load;@end@implementation Person+ (void)load{ NSLog(@"Person-----load");}+ (void)initialize{ NSLog(@"Person-initialize");}@end@interface Student : Person+ (void)load;@end@implementation Student+ (void)load{ NSLog(@"Student-----load");}+ (void)initialize{ NSLog(@"Student-initialize");}@endint main(){ [[Student alloc]init]; return 0;}
結果:
2015-01-24 14:24:18.588 07-類的本質[10729:1164951] Person----load2015-01-24 14:24:18.589 07-類的本質[10729:1164951] Student----load2015-01-24 14:24:18.589 07-類的本質[10729:1164951] Person-initialize2015-01-24 14:24:18.590 07-類的本質[10729:1164951] Student-initialize
如果我們把main()函數裡的改一下:
int main(){[[Person alloc]init];return 0;}
那麼結果就是:
2015-01-24 14:25:17.760 07-類的本質[10738:1165590] Person----load2015-01-24 14:25:17.761 07-類的本質[10738:1165590] Student----load2015-01-24 14:25:17.761 07-類的本質[10738:1165590] Person-initialize
原因其實很簡單, 在main()函數中, 如果我們有載入到子類的話, 那麼initialize方法就是從父類一直載入到子類, 但如果只用到父類的話, 那麼子類就不會被載入.
load方法詳解: 當程式啟動的時候, 就會載入一次項目中所有的類, 類載入完畢後就會調用+ (void)load方法.
initialize方法詳解: 當第一次使用這個類的時候, 就會載入一次+ (void)initialize方法.
好了, 這次我們就講到這裡, 下次我們繼續~~~