OC 訊息機制

2021-07-08 18:20:27 字數 1647 閱讀 1721



任何資料結構,只要在恰當的位置具有乙個指標指向乙個class,那麼,它都可以被認為是乙個物件

在oc中,乙個物件所屬於哪個類,是由它的isa指標指向的。這個isa指標指向這個物件所屬的class

執行原理:

當向oc物件傳送訊息時,執行時庫會根據物件的isa指標找到這個物件所屬的類。這個類會包含乙個所有例項方法的列表及乙個指向superclass的指標以便可以找到父類的例項方法。執行時庫會在類的方法列表以及父類們的方法列表中尋找符合這個selector的方法。找到後即執行這個方法。關鍵點就是類要定義這個要傳送給物件的訊息

傳送訊息機制:

乙個oc的類其實也是乙個物件,就是可以向乙個類傳送訊息

因為每乙個oc的類本身也是乙個物件。也就是說class的資料結構必然也是以isa指標開始的在二進位制級別上與objc_object是完全相容的。然後乙個類結構的下乙個字段一定是乙個指向super class的指標(或者指向nil,對於基類來說)

乙個類如何定義有很多方法,依賴於你的執行時庫版本,但是無論怎樣,都是以乙個isa作為第乙個字段,接著是superclass欄位。

為了可以呼叫類方法,這個類的isa指標必須指向乙個包含這些類方法的類結構體:

meta-class是乙個類物件的類

當向乙個對傳送訊息時,runtime會在這個物件所屬的那個類的方法列表中查詢

當向乙個類傳送訊息時,runtime會在這個類的meta-class的方法列表中查詢

meta-class儲存著乙個類的所有類方法。每個類都會有乙個單獨的meta-class,因為每個類的類方法基本不可能完全相同的

meta-class

meta-class與class一樣,也是乙個物件,依舊可以向它傳送訊息呼叫函式,自然的,meta-class也會有乙個isa指標指向其所屬類。所有的基類的meta-class作為他們的所屬類。任何nsobject繼承體系下的meta-class都使用nsobject的meta-class作為自己所屬的類

所有的meta-class使用基類的meta-class作為它們的基類,而基類的meta-class也是屬於它自己,也就是基類的meta-class的isa指標指向自己。這是乙個完美的閉環

類和meta-class的繼承

與乙個類使用super_class指標指向自己的父類一樣,meta-class的super_class會指向類的super_class的meta-class。一直追溯到基類的meta-class,它的super_class會指向基類自身(萬物歸根)

整個繼承體系中的例項、類和meta-class都派生自繼承體系中的基類。對於nsobject繼承體系來說,nsobject的例項方法對體系中所有的例項、類和meta-class都是有效的。nsobject的類方法對於體系中所有的類和meta-class都是有效的

總結:meta-class是類物件的類,每個類都有自己單獨的meta-class。所有的類物件並不會屬於同乙個meta-class。

meta-class要保證類物件具有繼承體系中基類的所有例項和類方法,以及繼承體系中的所有中間類方法。對於所有nsobject繼承體系下的類,nsobject的例項方法和協議方法對它們和它們meta-class的物件都要有效

所有的meta-class使用基類的meta-class作為自己的基類,對於頂層基類的meta-class也是一樣,只是它指向本身而已

摘自:

OC 的反射機制

class 的反射 通過類名的字串形式例項化物件 class class nsclassfromstring student student stu class alloc init 將類名變成字串 class class student class string classname nsstrin...

windows訊息機制

一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...

訊息機制 WSAAsyncSelect

訊息機制 wsaasyncselect wsaasyncselect基於windows訊息機制非同步i o模型,為特定網路事件指定系統通知資訊.函式定義 int wsaasyncselect socket s,hwnd hwnd,unsigned int wmsg,long levent 1 引數4...