ios 中物件建立是分兩步完成:
建立nsobject物件的過程:
oc類沒有建構函式,但有類似建構函式的初始化方法,初始化函式與類名不一致,且不會自動呼叫
oc類初始化方法特徵:
初始化方法分類:
#ifndef ns_designated_initializer
#if __has_attribute(objc_designated_initializer)
#define ns_designated_initializer __attribute__((objc_designated_initializer))
#else
#define ns_designated_initializer
#endif
#endif
__has_attribute是clang的乙個用於檢測當前編譯器是否支援某一特性的巨集,通過上面定義,可以知道ns_designated_initializer其實是給初始化方法宣告的後面加上了乙個編譯器可見的標記,通過這個標記,可以在編譯時就幫開發者找出一些潛在的初始化問題,避免程式執行時出現一些奇怪行為,編譯器會通過warning提示開發者潛在的初始化問題
指定初始化方法對乙個類來說非常重要,指定初始化方法一般分兩種極端情況:
上述兩種極端的指定初始化方法都有缺點,便利初始化方法就是用來解決上述兩種指定初始化方法缺點的,便利初始化方法提供特定引數,用來對特定資料成員設定特定值,在便利初始化方法中呼叫指定初始化方法,用特定引數對特定資料成員設定特定值,其他資料成員使用固定值或預設值,便利初始化方法讓開發者比較簡單方便的建立物件,因此可把指定初始化方法理解為通用初始化方法,對所有資料成員提供特定值或預設值,便利初始化方法理解為特定初始化方法,對特定資料成員設定特定值,其他資料成員使用固定值或預設值
c++類建構函式的設計原則確保類的所有成員都得到合適的初始化,oc類初始化方法設計原則亦如此,確保類的所有資料成員得到合適的初始化
遵守上述oc類初始化方法設計規範之後,就可確保類的所有資料成員都能得到合適的初始化,初始化分以下幾種情況:
上述分析可見oc類初始化方法核心是指定初始化方法,因為最終都呼叫到指定初始化方法,因此指定初始化方法必須呼叫父類指定初始化方法,並且初始化自身資料成員,這樣就可確保類的所有資料成員都能得到合適的初始化
類初始化和例項初始化
乙個類要建立例項需要先載入並初始化該類 main方法所在的類需要先載入和初始化 乙個子類要初始化需要先初始化父類 乙個類初始化就是執行clinit 方法 clinit 方法由靜態類變數顯式賦值 和靜態 塊組成 類變數顯式賦值 和靜態 塊 從上到下順序執行 clinit 方法只執行一次 父類的初始化 ...
類初始化和例項初始化
father public class father father public inttest public static intmethod son public class sonextends father son public inttest public static intmethod...
類初始化 例項初始化 方法重寫
乙個類要建立例項需要先載入並初始化該類 乙個子類要初始化需要先初始化父類 乙個類初始化就是執行 clinit 方法 例項初始化就是執行 init 方法 哪些方法不可以被重寫 物件的多型性 父類 author barrylee 2018年11月10日 下午3 52 33 public class fa...