iOS 中 id 類型

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

相關文章
相關標籤/搜索