ios 基礎學習

2021-09-24 13:51:44 字數 3685 閱讀 7124

oc 動態繫結

訊息傳遞機制

oc 的方法吊用,其實就是物件接受乙個訊息,然後訊息傳送 動態繫結機制,尋找對應的方法體,直到找到方法體

然後執行

動態繫結

動態繫結是基於動態型別的,在執行時物件的型別確定後,那麼物件的屬性和方法也就確定了(包括類中原來的屬性和方法以及執行時動態新加入的屬性和方法),這也就是所謂的動態繫結了。動態繫結的核心就該是在執行時動態的為類新增屬性和方法,以及方法的最後處理或**,主要用到c語言語法,因為涉及到執行時,因此要引入執行時標頭檔案:#include 。

動態繫結指的是方法確定的動態性,具體指的是利用oc的訊息傳遞機制將要執行的方法的確定推遲到執行時,可以動態新增方法。也就是說,乙個oc物件是否呼叫某個方法不是由編譯器決定的,而是由執行時決定的;另外關於動態繫結的關鍵一點是基於訊息傳遞機制的訊息**機制,主要處理應對一些接受者無法處理的訊息,此時有機會將訊息**給其他接收者處理,具體見下面介紹。

動態繫結是基於動態型別的,在執行時物件的型別確定後,那麼物件的屬性和方法也就確定了(包括類中原來的屬性和方法以及執行時動態新加入的屬性和方法),這也就是所謂的動態繫結了。動態繫結的核心就該是在執行時動態的為類新增屬性和方法,以及方法的最後處理或**,主要用到c語言語法,因為涉及到執行時,因此要引入執行時標頭檔案:#include 。

訊息傳遞機制:

在oc中,方法的呼叫不再理解為物件呼叫其方法,而是要理解成物件接收訊息,訊息的傳送採用『動態繫結』機制,具體會呼叫哪個方法直到執行時才能確定,確定後才會去執行繫結的**。方法的呼叫實際就是告訴物件要幹什麼,給物件(的指標)傳送乙個訊息,物件為接收者(receiver),呼叫的方法及其引數即訊息(message),給乙個物件傳訊息表達為:[receiver message]; 接受者的型別可以通過動態型別識別於執行時確定。

在訊息傳遞機制中,當開發者編寫[receiver message];語句傳送訊息後,編譯器都會將其轉換成對應的一條objc_msgsend c語言訊息傳送原語,具體格式為:

void objc_msgsend (id self, sel cmd, …)

這個原語函式引數可變,第乙個引數填入訊息的接受者,第二個引數是訊息『選擇子』,後面跟著可選的訊息的引數。有了這些引數,objc_msgsend就可以通過接受者的的isa指標,到其類物件中的方法列表中以選擇子的名稱為『鍵』尋找對應的方法,找到則轉到其實現**執行,找不到則繼續根據繼承關係從父類中尋找,如果到了根類還是無法找到對應的方法,說明該接受者物件無法響應該訊息,則會觸發『訊息**機制』,給開發者最後一次挽救程式崩潰的機會。

我們所說的objective-c是動態執行時語言是什麼意思?

主要指的是oc語言的動態性,包括動態性和多型性兩個方面。

動態性:即oc的動態型別、動態繫結和動態載入特性,將物件型別的確定、方法呼叫的確定、**和資源的裝載等推遲到執行時進行,更加靈活;

多型:多型是物件導向變成語言的特性,oc作為一門物件導向的語言,自然具備這種多型性,多型性指的是來自不同類的物件可以接受同一訊息的能力,或者說不同物件以自己的方式響應相同的訊息的能力。

問題:動態繫結是在執行時確定要呼叫的方法?

動態繫結將呼叫方法的確定推遲到執行時。在編譯時,方法的呼叫並不和**繫結在一起,只有在消實傳送出來之後,才確定被呼叫的**。通過動態型別和動態繫結技術,**每次執行都可以得到不同的結果。執行時負責確定訊息的接收者和被呼叫的方法。執行時的訊息分發機制為動態繫結提供支援。當向乙個動態型別確定了的物件傳送訊息時,執行環境會通過接收者的isa指標定位物件的類,並以此確定被呼叫的方法,方法是動態繫結的。

問題:解釋oc中的id型別?id、nil代表什麼?

id表示變數或物件的型別在編寫**時(編譯期)不確定,視為任意型別,直到程式跑起來推遲到執行時才最終確定其型別。id類似於c/c++中的void ,但id和void並非完全一樣。id是乙個指向繼承了nsobject的oc物件的指標,注意id是乙個指標,雖然省略了號。id和c語言的void之間需要通過bridge關鍵字來顯式的橋接轉換。具體轉換方式示例如下:

id nsobj = [[nsobject alloc] init];

void *p = (__bridge void *)nsobj;

id nsobj = (__bridge id)p;

oc中的nil定義在objc/objc.h中,表示的是乙個指向空的objctive-c物件的指標。例如weak修飾的弱引用物件在指向的物件釋放時會自動將指標置為nil,即空物件指標,防止『指標懸掛』。

問題:instancetype和id的區別?

**instancetype和id都可以用來代表任意型別,將物件的型別確定往後推遲,用於體現oc語言的動態性,使其宣告的物件具有執行時的特性。

它們的區別是:instancetype只能作為返回值型別,但在編譯期instancetype會進行型別檢測,因此對於所有返回類的例項的類方法或例項方法,建議返回值型別全部使用instancetype而不是id,具體原因後面舉例介紹;id型別既可以作為返回值型別,也可以作為引數型別,也可以作為變數的型別,但id型別在編譯期不會進行型別檢測**。

訊息傳遞機制

在oc中,方法的呼叫不再理解為物件呼叫其方法,而是要理解成物件接收訊息,訊息的傳送採用『動態繫結』機制,具體會呼叫哪個方法直到執行時才能確定,確定後才會去執行繫結的**。方法的呼叫實際就是告訴物件要幹什麼,給物件(的指標)傳送乙個訊息,物件為接收者(receiver),呼叫的方法及其引數即訊息(message),給乙個物件傳訊息表達為:[receiver message]; 接受者的型別可以通過動態型別識別於執行時確定。

在訊息傳遞機制中,當開發者編寫[receiver message];語句傳送訊息後,編譯器都會將其轉換成對應的一條objc_msgsend c語言訊息傳送原語,具體格式為:

void objc_msgsend (id self, sel cmd, …)

這個原語函式引數可變,第乙個引數填入訊息的接受者,第二個引數是訊息『選擇子』,後面跟著可選的訊息的引數。有了這些引數,objc_msgsend就可以通過接受者的的isa指標,到其類物件中的方法列表中以選擇子的名稱為『鍵』尋找對應的方法,找到則轉到其實現**執行,找不到則繼續根據繼承關係從父類中尋找,如果到了根類還是無法找到對應的方法,說明該接受者物件無法響應該訊息,則會觸發『訊息**機制』,給開發者最後一次挽救程式崩潰的機會。

訊息**機制:

如果訊息傳遞過程中,接受者無法響應收到的訊息,則會觸發進入『訊息**』機制。

訊息**依次提供了三道防線,任何乙個起作用都可以挽救此次訊息**。按照先後順序三道防線依次為:

動態補加方法的實現

+ (bool)resolveinstancemethod:(sel)sel

+ (bool)resolveclassmethod:(sel)sel

直接返回訊息**到的物件(將訊息傳送給另乙個物件去處理)

- (id)forwardingtargetforselector:(sel)aselector
手動生成方法簽名並**給另乙個物件

- (nsmethodsignature *)methodsignatureforselector:(sel)aselector;

- (void)forwardinvocation:(nsinvocation *)aninvocation;

IOS 學習基礎。

在bank.h檔案中 import inte ce bank nsobject nsstring name int amount void print void addamount int a int amount bank initwithname nsstring n andamount int...

IOS學習 OC基礎學習1

oc 在c的基礎上增加了一層最好的物件導向語法 副檔名.m 基本語法 1 關鍵字 基本上所有的關鍵字都是以 開頭 2 字串一 開頭 其他與法 引進了bool型別 yes,no nil 相當於c語言中的null,也是0 nslog hello nslog d 27 與 之間無空格,且輸出之後自動換行 ...

IOS學習 OC基礎學習4

點語法 person類中有 age乙個成員變數 設定成員變數 age的值 person p person new p.age 10 p setage 10 獲取成員變數的值 int a p.age p age 根據有無賦值判斷是get方法還是set方法 點語法的本質還是方法呼叫 可通過在set和ge...