iOS中id型別的理解及底層原理詳解

2022-10-03 15:21:17 字數 1527 閱讀 6711

前言

id:是一種資料型別;

id型別被定義為指向物件的指標,這可以從id的定義中看出。id在objc.h中的定義為:

typedef struct objc_object *id;

id是乙個乙個比較靈活的物件指標,並且是乙個指向任何乙個繼承了object(或者nsobject)類的物件。而在cocoa的開發環境裡,nsobject是所有類的根類。所以id可以指向任何乙個cocoa的合法物件。

objective-c中的id這種資料型別存在的價值是什麼?

id型別:

id是乙個資料型別, 並且是乙個動態資料型別

既然是資料型別, 所以就可以用來

1、定義變數

2、作為函式的引數

3、作為函式的返回值

4、id == nsobject *   萬能指標

id和nsobject *的區別:

nsobject *是乙個靜態資料型別

id  是乙個動態資料型別

預設情況下所有的資料型別都是靜態資料型別

靜態資料型別的特點:

1、在編譯時就知道變數的型別,

2、知道變數中有哪些屬性和方法

3、在編譯的時候就可以訪問這些屬性和方法, 

4、如果是通過靜態資料型別定義變數, 如果訪問不了屬於靜態資料型別的屬性和方法, 那麼編譯器就會報錯

動態資料型別的特點:

1、在編譯的時候編譯器並不知道變數的真實型別, 只有在執行的時候才知道它的真實型別

2、如果通過動態資料型別定義變數, 如果訪問了不屬於動態資料型別的屬性和方法, 編譯器不會www.cppcns.com報錯

通過靜態資料型別定義變數, 不能呼叫子類特有的方法

通過動程式設計客棧態資料型別定義變數, 可以呼叫子類特有的方法

通過動態資料型別定義的變數, 可以呼叫私有方法

弊端: 由於動態資料型別可以呼叫任意方法, 所以有可能呼叫到不屬於自己的方法www.cppcns.com, 而編譯時又不會報錯, 所以可能導致執行時的錯誤

應用場景: 多型, 可以減少**量, 避免呼叫子類特有的方法需要強制型別轉換

為了避免動態資料型別引發的執行時的錯誤, 一般情況下如果使用動態資料型別定義乙個變數, 在呼叫這個物件的方法之前會進行一次判斷, 判斷當前物件是否能夠呼叫這個方法

instancetype和id的區別:

1、instancetype == id == 萬能指標 == 指向乙個物件

2、id在編譯的時候不能判斷物件的真實型別

3、instancetype在編譯的時候可以判斷物件的真實型別(乙個在編譯時不知道真實型別, 乙個在編譯時知道真實型別)

4、id可以用來定義變數, 可以作為返回值, 可以作為形參

5、instancetype只能用於作為返回值,它會進行型別檢查,如果建立出來的物件,賦值了不相干的物件就會有乙個警告資訊,防止出錯

注意:以後但凡自定義構造方法, 返回值盡量使用instancetypewww.cppcns.com, 不要使用id

總結本文標題: ios中id型別的理解及底層原理詳解

本文位址:

iOS中id與NSObject 和id的區別

1.我們來看看id的定義,它就是乙個指標,它可以指向的型別不僅限於nsobject 1typedefstructobjc class class 2typedefstructobjc object id 2.nsobject 就是 nsobject型別的指標了,它範圍較小。3.id是指標,它要求它指...

理解C 中引用的底層實現

1 c primer提到 引用並非物件,相反的,它只是為乙個已經存在的物件所起的另外乙個名字。引用的定義必須伴隨初始化,而且一旦定義了引用,就無法令其再繫結到另外的物件,之後每次使用這個引用都是訪問它最初繫結的那個物件。2 何為物件?對於物件導向來說,物件就是類的例項,是抽象化的資料本身。更廣義的來...

iOS中MVC的理解

mvc就是models views controllers model 模型 代表著你的應用程式是什麼,與使用者介面無關 controller 控制器 controller控制view如何把model 資料模型 顯示出來,是連通model和view的橋梁 view 檢視 就是顯示給使用者的那一部分 ...