iOS 中 id 類型
id 類型是iOS中一種特殊的動態數據類型,其存在價值:ios
- id是一種通用的對象類型,她能夠用類存儲屬於任何類的對象,能夠理解爲萬能指針
- 在id的定義中,已經包裝好了*號,id指針只能指向 ios 的對象
- NSObject 和id均可以指向任何對象
- NSObject對象會進行編譯時檢查(須要強制類型轉換)
- id不須要強制類型轉換,id能夠直接使用
- 編譯器看到id之後,認爲是動態類型,再也不檢查類型
id是一個一個比較靈活的對象指針,而且是一個指向任何一個繼承了Object(或者NSObject)類的對象。而在cocoa的開發環境裏,NSObject是全部類的根類。因此id能夠指向任何一個cocoa的合法對象。 在objc.h中定義markdown
typedef struct objc_object {
Class isa;
} *id;
複製代碼
既然是數據類型, 因此就能夠用來函數
- 一、定義變量
- 二、做爲函數的參數
- 三、做爲函數的返回值
- 四、id == NSObject *萬能指針
id和NSObject *的區別:
- NSObject *是一個靜態數據類型
- id 是一個動態數據類型
- 默認狀況下全部的數據類型都是靜態數據類型
靜態數據類型的特色:
- 一、在編譯時就知道變量的類型,
- 二、知道變量中有哪些屬性和方法
- 三、在編譯的時候就能夠訪問這些屬性和方法,
- 四、若是是經過靜態數據類型定義變量, 若是訪問不了屬於靜態數據類型的屬性和方法, 那麼編譯器就會報錯
動態數據類型的特色:
- 一、在編譯的時候編譯器並不知道變量的真實類型, 只有在運行的時候才知道它的真實類型
- 二、若是經過動態數據類型定義變量, 若是訪問了不屬於動態數據類型的屬性和方法, 編譯器不會報錯
經過靜態數據類型定義變量, 不能調用子類特有的方法 經過動態數據類型定義變量, 能夠調用子類特有的方法 經過動態數據類型定義的變量, 能夠調用私有方法spa
動態數據類型弊端:
因爲動態數據類型能夠調用任意方法, 因此有可能調用到不屬於本身的方法, 而編譯時又不會報錯, 因此可能致使運行時的錯誤指針
動態數據類型應用場景:
多態, 能夠減小代碼量, 避免調用子類特有的方法須要強制類型轉換
複製代碼
爲了不動態數據類型引起的運行時的錯誤, 通常狀況下若是使用動態數據類型定義一個變量, 在調用這個對象的方法以前會進行一次判斷, 判斷當前對象是否可以調用這個方法code
instancetype和id的區別:
- 一、instancetype == id == 萬能指針 == 指向一個對象
- 二、id在編譯的時候不能判斷對象的真實類型
- 三、instancetype在編譯的時候能夠判斷對象的真實類型(一個在編譯時不知道真實類型, 一個在編譯時知道真實類型)
- 四、id能夠用來定義變量, 能夠做爲返回值, 能夠做爲形參
- 五、instancetype只能用於做爲返回值,它會進行類型檢查,若是建立出來的對象,賦值了不相干的對象就會有一個警告信息,防止出錯
注意: 之後但凡自定義構造方法, 返回值儘可能使用instancetype, 不要使用idorm