OC動態繫結

2021-07-08 10:38:27 字數 1925 閱讀 6225

參考:

多型:允許不同的類定義相同的方法。

動態型別:程式直到執行時才能確定所屬的類。

動態繫結:程式直到執行時才能確定實際要呼叫的方法。

id型別:一種通用的物件型別,也就是說,id可以用來儲存屬於任何類的物件,讓不同類的輸出不用特定設定,通用乙個id型別就好。

多型的出現時為了讓不同的類能使用同明的方法。比如add,這個讓程式的可讀性大大提高,也降低了程式設計難度。add就是+,哪種型別的+都用add標明方法,清晰易懂。

動態型別與動態繫結是為了解決隨多型的便利而引起的弊端,有了動態型別與動態繫結,不用去考慮輸出中的add是哪個型別的add,會自動判定。

而id型別的出現就是為了更好的承接動態型別與動態方法出來的返回值。讓對應add的sum也只有乙個,輸出時只需要輸出sum,不需要在各個類中自行定義sum。

objective-c具有相當多的動態特性,基本的,也是經常被提到和用到的有動態型別(dynamic typing),動態繫結(dynamic binding)和動態載入(dynamic loading)。

動態特性基礎

1、動態型別

即執行時再決定物件的型別。這類動態特性在日常應用中非常常見,簡單說就是id型別。id型別即通用的物件類,任何物件都可以被id指標所指,而在實際使用中,往往使用introspection來確定該物件的實際所屬類:

id obj = someinstance;

if ([obj iskindofclass:someclass])

-ismemberofclass: 是 nsobject 的方法,用以確定某個 nsobject 物件是否是某個類的成員。與之相似的為 -iskindofclass:,可以用以確定某個物件是否是某個類或其子類的成員。這兩個方法為典型的introspection方法。在確定物件為某類成員後,可以安全地進行強制轉換,繼續之後的工作。

2、動態繫結

在objective-c中,訊息由selector所代表,其為描述需要呼叫的方法的乙個字串。在傳送訊息時,該selector被送入objective-c執行時中,在可用方法列表中尋找對應的方法,然後呼叫該方法的實際實現。由於selector只是文字資料,因此它可以儲存在檔案中,通過網路或在程序間傳輸,或以其它方式進行操作。方法的實現是在執行時查詢的,而非編譯時。這樣的做法會造成一些效能損失,但動態繫結允許相同的selector代表不同的實現。

動態繫結所做的,即是在例項所屬類確定後,將某些屬性和相應的方法繫結到例項上。這裡所指的屬性和方法當然包括了原來沒有在類中實現的,而是在執行時才需要的新加入的實現。在cocoa層,我們一般向乙個nsobject物件傳送-respondstoselector:或者-instancesrespondtoselector:等來確定物件是否可以對某個sel做出響應,而在oc訊息**機制被觸發之前,對應的類的+resolveclassmethod:和+resolveinstancemethod:將會被呼叫,在此時有機會動態地向類或者例項新增新的方法,也即類的實現是可以動態繫結的。乙個例子:

void dynamicmethodimp(id

self, sel _cmd)

//該方法在oc訊息**生效前被呼叫

+ (bool) resolveinstancemethod:(sel)asel

return [super resolveinstancemethod:asel];

}

當然也可以在任意需要的地方呼叫class_addmethod或者method_setimplementation(前者新增實現,後者替換實現),來完成動態繫結的需求。

3、動態載入

根據需求載入所需要的資源,這點很容易理解,對於ios開發來說,基本就是根據不同的機型做適配。最經典的例子就是在retina裝置上載入@2x的,而在老一些的普通屏裝置上載入原圖。隨著retina ipad的推出,和之後可能的retina mac的出現,這個特性相信會被越來越多地使用。

OC中的動態繫結與多型問題

1.什麼是多型?程式中的多型 不同的物件以自己的方式響應相同名稱方法的能力稱為多型 2.多型的條件 多型的條件 有繼承關係 有方法重寫 父類的宣告變數指向子類物件。3.多型的優點 多型的主要好處就是 簡化了程式設計介面 它容許 在類和類之間重用一些習慣性的命名 而不用為每乙個新加的函式命名乙個新名字...

第一次接觸OC多型,動態型別與動態繫結

多型 允許不同的類定義相同的方法。動態型別 程式直到執行時才能確定所屬的類。動態繫結 程式直到執行時才能確定實際要呼叫的方法。id型別 一種通用的物件型別,也就是說,id可以用來儲存屬於任何類的物件,讓不同類的輸出不用特定設定,通用乙個id型別就好。多型的出現時為了讓不同的類能使用同明的方法。比如a...

靜態繫結和動態繫結

c 中,非虛函式都是靜態繫結,而虛函式卻是動態繫結。為了能夠更清楚地了解靜態繫結與動態繫結,我們可以看下面這個例子 include using namespace std class b 那麼兩次呼叫fun 函式是否相同呢?當然,如果d中沒有定義fun 函式 如例子中 那麼兩次呼叫的行為肯定會是一樣...