iOS-方法之+ initialize 與 +load(轉載)

來源:互聯網
上載者:User

標籤:應用   highlight   ace   undle   nil   檢查   oid   官方   訊息   

Objective-C 有兩個神奇的方法:+load 和 +initialize,這兩個方法在類被使用時會自動調用。但是兩個方法的不同點會導致應用程式層面上效能的顯著差異。

一、+ initialize 方法和+load 調用時機
  • 首先說一下 + initialize 方法:蘋果官方對這個方法有這樣的一段描述:這個方法會在 第一次初始化這個類之前 被調用,我們用它來初始化靜態變數。
    • load 方法會在載入類的時候就被調用,也就是 ios 應用啟動的時候,就會載入所有的類,就會調用每個類的 + load 方法。
  • 之後我們結合代碼來探究一下 + initialize 與 + load 兩個方法的調用時機,首先是 + load
    #pragram ---main函數中的代碼---
    #import <UIKit/UIKit.h>#import "AppDelegate.h"int main(int argc, char * argv[]) {  NSLog(@"%s",__func__);  @autoreleasepool {      return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));  }}
     #pragram ---基於NSObject的Person類--- 
    #import "Person.h" @implementation Person + (void)load{ NSLog(@"%s",__func__); } + (void)initialize{     [super initialize];     NSLog(@"%s %@",__func__,[self class]); } - (instancetype)init{    if (self = [super init]){      NSLog(@"%s",__func__); } return self; } @end 
    #pragram ---基於Person的Son類--- 
    #import "Girl.h" @implementation Girl + (void)load{      NSLog(@"%s ",__func__); } + (void)initialize{    [super initialize];    NSLog(@"%s ",__func__);} - (instancetype)init{    if (self = [super init]){    NSLog(@"%s",__func__); }  return self; } @end
    運行程式,我們看一下輸出日誌:
    2015-10-27 15:21:07.545 initialize[11637:334237] +[Person load]2015-10-27 15:21:07.546 initialize[11637:334237] +[Girl load] 2015-10-27 15:21:07.546 initialize[11637:334237] main
    這說明在我並沒有對類做任何操作的情況下,+load 方法會被預設執行,並且是在 main 函數之前執行的。
  • 接下來我們來查看一下 + initialize 方法,先在 ViewController 中建立 Person 和 Girl 對象:
    #import "ViewController.h"#import "Person.h"#import "Son.h"#import "Girl.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];  Person * a = [Person new];  Person * b = [Person new];  Girl *c = [Girl new];  Girl *d = [Girl new];}@end
    下面我們來看一下輸出日誌:
    2015-10-27 15:33:56.195 initialize[11711:342410] +[Person load]2015-10-27 15:33:56.196 initialize[11711:342410] +[Girl load] 2015-10-27 15:33:56.197 initialize[11711:342410] main2015-10-27 15:33:56.259 initialize[11711:342410] +[Person initialize] Person2015-10-27 15:33:56.259 initialize[11711:342410] -[Person init]2015-10-27 15:33:56.259 initialize[11711:342410] -[Person init]2015-10-27 15:33:56.259 initialize[11711:342410] +[Girl initialize] 2015-10-27 15:33:56.260 initialize[11711:342410] -[Girl init]2015-10-27 15:33:56.260 initialize[11711:342410] -[Girl init]
    通過這個實驗我們可以確定兩點:
    • + initialize 方法類似一個懶載入,如果沒有使用這個類,那麼系統預設不會去調用這個方法,且預設只載入一次;
    • + initialize 的調用發生在 +init 方法之前。
  • 接下來再探究一下 + initialize 在父類與子類之間的關係,建立一個繼承自 Person 類的 Son類:
    #pragram ---ViewController 中的代碼---
    #import "ViewController.h"#import "Person.h"#import "Son.h"#import "Girl.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];  Person * a = [Person new];  Person * b = [Person new];  Son*z = [Son new];}@end
    看一下輸出日誌:
    2015-10-27 15:44:55.762 initialize[12024:351576] +[Person load]2015-10-27 15:44:55.764 initialize[12024:351576] +[Son load]2015-10-27 15:44:55.764 initialize[12024:351576] +[Girl load] 2015-10-27 15:44:55.764 initialize[12024:351576] main2015-10-27 15:44:55.825 initialize[12024:351576] +[Person initialize] Person2015-10-27 15:44:55.825 initialize[12024:351576] -[Person init]2015-10-27 15:44:55.825 initialize[12024:351576] -[Person init]2015-10-27 15:44:55.826 initialize[12024:351576] +[Person initialize] Son2015-10-27 15:44:55.826 initialize[12024:351576] -[Person init]
    我們會發現 Person 類的 + initialize 方法又被調用了,但是查看一下是子類 Son 調用的,也就是建立子類的時候,子類會去調用父類的 + initialize 方法。
二、總結
  • 如果你實現了 + load 方法,那麼當類被載入時它會自動被調用。這個調用非常早。如果你實現了一個應用或架構的 + load,並且你的應用連結到這個架構上了,那麼 + load 會在 main() 函數之前被調用。如果你在一個可載入的 bundle 中實現了 + load,那麼它會在 bundle 載入的過程中被調用。
  • + initialize 方法的調用看起來會更合理,通常在它裡面寫代碼比在 + load 裡寫更好。+ initialize 很有趣,因為它是懶調用的,也有可能完全不被調用。類第一次被載入時,
  • + initialize 不會被調用。類接收訊息時,運行時會先檢查 + initialize 有沒有被調用過。如果沒有,會在訊息被處理前調用。

iOS-方法之+ initialize 與 +load(轉載)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.