iOS load和initialize的區別

2021-09-13 21:21:00 字數 3418 閱讀 7379

可能有些童鞋還不清楚load和initialize的區別,下面簡單說一下:

首先說一下 + initialize 方法:蘋果官方對這個方法有這樣的一段描述:這個方法會在 第一次初始化這個類之前 被呼叫,我們用它來初始化靜態變數.

initialize方法的呼叫時機,當向該類傳送第乙個訊息(一般是類訊息首先呼叫,常見的是alloc)的時候,先呼叫類中的,再呼叫類別中的(類別中如果有重寫);如果該類只是引用,沒有呼叫,則不會執行initialize方法。

兩者方法的共同點:自動呼叫父類的,不需要super操作;自動呼叫僅僅會呼叫一次(不包括外部顯示呼叫).

load 方法會在載入類的時候就被呼叫,也就是 ios 應用啟動的時候,就會載入所有的類,就會呼叫每個類的 + load 方法.

load方法的呼叫時機,main函式之前,先呼叫類中的,再呼叫類別中的(類別中如果有重寫).

**演示:

#pragram —基於nsobject的person類—

#import 「person.h」

@implementation person

#pragram —基於person的son類—

#import 「girl.h」

@implementation girl

輸出日誌:

2017-07-07 09:28:36.535 initialize[1572:27457]] +[person load]

2017-07-07 09:28:36.535 initialize[1572:27457]] +[girl load]

2017-07-07 09:28:36.535 initialize[1572:27457]] main

這說明在我並沒有對類做任何操作的情況下,+load 方法會被預設執行,並且是在 main 函式之前執行的。

#接下來我們來檢視一下 + initialize 方法,先在 viewcontroller 中建立 person 和 girl 物件:

#import 「viewcontroller.h」

#import 「person.h」

#import 「son.h」

#import 「girl.h」

@inte***ce viewcontroller ()

@end

@implementation viewcontroller

輸出日誌:

2017-07-07 09:34:57.134 initialize[1840:100060] +[person load]

2017-07-07 09:34:57.135 initialize[1840:100060] +[girl load]

2017-07-07 09:34:57.136 initialize[1840:100060] main

2017-07-07 09:34:57.198 initialize[1840:100060] +[person initialize] person

2017-07-07 09:34:57.198 initialize[1840:100060] -[person init]

2017-07-07 09:34:57.198 initialize[1840:100060] -[person init]

2017-07-07 09:34:57.198 initialize[1840:100060] +[girl initialize]

2017-07-07 09:34:57.199 initialize[1840:100060] -[girl init]

2017-07-07 09:34:57.199 initialize[1840:100060] -[girl init]

那麼+ initialize 在父類與子類之間的關係是什麼楊,我們建立乙個繼承自 person 類的 son類:

#pragram —viewcontroller 中的**—

#import 「viewcontroller.h」

#import 「person.h」

#import 「son.h」

#import 「girl.h」

@inte***ce viewcontroller ()

@end

@implementation viewcontroller

輸出日誌:

複製**

2017-07-07 09:50:14.140 initialize[1893:109979] +[person load]

2017-07-07 09:50:14.142 initialize[1893:109979] +[son load]

2017-07-07 09:50:14.142 initialize[1893:109979] +[girl load]

2017-07-07 09:50:14.142 initialize[1893:109979] main

2017-07-07 09:50:14.203 initialize[1893:109979] +[person initialize] person

2017-07-07 09:50:14.203 initialize[1893:109979] -[person init]

2017-07-07 09:50:14.203 initialize[1893:109979]] -[person init]

2017-07-07 09:50:14.204 initialize[1893:109979] +[person initialize] son

2017-07-07 09:50:14.204 initialize[1893:109979] -[person init]

複製**

我們會發現 person 類的 + initialize 方法又被呼叫了,但是檢視一下是子類 son 呼叫的,也就是建立子類的時候,子類會去呼叫父類的 + initialize 方法。

這是因為在建立子類物件時,首先要建立父類物件,所以會呼叫一次父類的initialize方法,然後建立子類時,儘管自己沒有實現initialize方法,但還是會呼叫到父類的方法。

雖然initialize方法對乙個類而言只會呼叫一次,但這裡由於出現了兩個類,所以呼叫兩次符合規則,但不符合我們的需求。正確使用initialize方法的姿勢如下

// in person.m

加上判斷後,就不會因為子類而呼叫到自己的initialize方法了.

總結:1.load和initialize方法都會在例項化物件之前呼叫,以main函式為分水嶺,前者在main函式之前呼叫,後者在之後呼叫。這兩個方法會被自動呼叫,不能手動呼叫它們。

2.使子類沒有initialize方法也會呼叫父類的方法,而load方法則不會呼叫父類。

3.load方法通常用來進行method swizzle,initialize方法一般用於初始化全域性變數或靜態變數。

4.load和initialize方法內部使用了鎖,因此它們是執行緒安全的。實現時要盡可能保持簡單,避免阻塞執行緒,不要再使用鎖。

iOS load方法與initialize方法

在 ios 開發中,我們經常會使用 load 方法來做一些在main函式之前的操作,比如方法交換 method swizzle 等。現在分析一下load方法跟initialize方法的呼叫順序以及區別。1.先看下load方法 嘗試定義乙個繼承自nsobject的person類,並對其新增兩個分類li...

iOS load方法執行順序

1 load方法是在main函式執行前執行的 2 load方法是在載入類和分類時系統呼叫,一般不手動呼叫,如果想要在類或分類載入時做一些事情,可以重寫類或分類的 load方法。3 類 分類的 load方法,在程式執行過程只呼叫一次。呼叫順序 1 類要優先於分類呼叫 load方法 2 子類呼叫 loa...

使用者空間的初始化initial

取自 阿拉神農 linux image android 儲存disk工作 上篇我們知道,kernel初始化後將啟動init程序,那麼這個程序將幹些什麼呢?除此之外,kernel還需要做些什麼事情呢?想想檔案系統 根儲存裝置是在什麼時候初始化的呢?先從檔案系統初始化說起。以前一直不明白,有了kerne...