OC之訊息基本概念

2022-09-04 09:12:11 字數 2354 閱讀 4963

要說清楚訊息這個話題,我們必須先來了解三個概念 class, sel, imp,它們在 objc/objc.h 中定義: 

typedef struct objc_class *class; 

typedef struct

objc_object *id

;typedef

struct objc_selector *sel;

typedef id (*imp)(id, sel, ...);

class 被定義為乙個指向 objc_class 的結構體指標,這個結構體表示每乙個類的類結構。而 objc_class 在 objc/objc_class.h 中定義如下:

struct

objc_class ;

nsobject 的 class 方法就返回這樣乙個指向其類結構的指標。每乙個類例項物件的第乙個例項變數是乙個指向該物件的類結構的指標,叫做isa.

通過該指標,物件可以訪問它對應的類以及相應的父類。如圖一 所示: 

如圖一所示,圓形所代表的例項物件的第乙個例項變數為 isa,它指向該類的類結構 the object』s class。 而該類結構有乙個指向其父類類結構的指標 superclass, 以及自身訊息名稱(selector)/實現位址(address) 的方法鍊錶。 

注意這裡所說的方法鍊錶裡面儲存的是 method 型別的。圖一中 selector 就是指 method 的

sel, address 就是指 method 的 imp。 method 在標頭檔案 objc_class.h 中定義如下: 

typedef struct objc_method *method;

typedef

struct

objc_ method

;

在前面我們看到方法選標 sel 的定義為:

typedef struct objc_selector *sel;

它是乙個指向 objc_selector 指標,表示方法的名字/簽名。 

-(nsinteger)maxin:(nsinteger)a theother:(nsinteger)b

nslog(

@"sel=%s

", @selector(maxin:theother:));

輸出:sel=maxin:theother:

不同的類可以擁有相同的 selector,這個沒有問題,因為不同類的例項物件 performselector 相同的 selector 時,會在各自的訊息選標(selector)/實現位址(address) 方法鍊錶中根據 selector 去查詢具體的 方法實現 imp, 然後用這個方法實現去執行具體的實現**。這是乙個動態繫結的過程,在編譯的時候, 我們不知道最終會執行哪一些**,只有在執行的時候,通過 selector 去查詢,我們才能確定具體的執行**。 

在前面我們也看到 imp 的定義為: typedef id (*imp)(id, sel, ...);

根據前面 id 的定義,我們知道 id 是乙個指向 objc_object 結構體的指標,該結構體只有乙個成員 isa,所 以任何繼承自 nsobject 的類物件都可以用 id 來指代,因為 nsobject 的第乙個成員例項就是 isa。 

imp 是乙個函式指標,這個被指向的函式包含乙個接收訊息的物件id(self 指標), 呼叫方法的選標 sel (方法名),以及不定個數的方法引數,並返回乙個 id。 

nsobject 類中的 methodforselector:方法就是這樣乙個獲取指向方法實現 imp 的指標, methodforselector:返回的指標和賦值的變數型別必須完全一致,包括方法的引數型別和返回值型別。 

下面的例子展示了怎麼使用指標來呼叫 setfilled:的方法實現: 

void (*setter)(id

, sel, bool);

inti;

setter = (void(*)(id

, sel, bool))[target methodforselector:@selector(setfilled:)];

for (i = 0; i < 1000; i++)

setter(targetlist[i], @selector(setfilled:), yes);

使用 methodforselector:來避免動態繫結將減少大部分訊息的開銷,但是這只有在指定的訊息被重** 送很多次時才有意義 

注意,methodforselector:是 cocoa 執行時系統的

訊息佇列技術之基本概念

最近一直在總結azure messaging servicebus messaging相關的技術 訊息順序 訊息持久化 複雜物件訊息的序列化 訊息事務 訊息回執等機制。感覺有必要補充一篇訊息佇列技術的基本概念,無論rabbitmq activemq還是其他,都有的一些基本概念 術語 機制,分享給大家...

訊息佇列技術之基本概念

無論rabbitmq activemq還是其他,都有的一些基本概念 術語 機制。1.訊息生產者 訊息者 佇列 主題 訊息生產者producer 傳送訊息到訊息佇列。訊息消費者consumer 從訊息佇列接收訊息。訊息佇列queue 乙個先進先出的訊息儲存區域。訊息按照順序傳送接收,一旦訊息被消費處理...

訊息佇列(Message Queue)基本概念

之前做日誌收集模組時,用到flume。另外也有的方案,整合kafaka來提公升系統可擴充套件性,其中涉及到訊息佇列當時自己並不清楚為什麼要使用訊息佇列。而在我自己提出的原始日誌採集方案中不適用訊息佇列時,有幾個基本問題 1.日誌檔案上傳過程,有個基本的生產者 消費者問題 2.另外系統崩潰時,資料丟失...