objc_msgsend函式
在oc語言裡面,訊息在執行時會繫結為(c語言)方法。編譯器會轉化乙個訊息表示式:
[receiver selector];
任何在訊息中傳遞的引數也會被objc_msgsend函式處理:
objc_msgsend(receiver, selector, arg1, arg2, ...);
訊息傳遞函式為動態繫結提供所有必要的內容:
訊息傳遞函式所使用的關鍵字隱藏在編譯器編譯生成的每個oc類和物件的結構體中。每乙個類結構都包含如下兩個本質的元素:
當乙個訊息被傳遞到乙個物件,訊息傳遞函式會沿著物件的isa指標找到其類結構以查詢方法選擇器以及訊息分發表。如果不能找到方法選擇器,訊息傳遞函式回繼續查詢其父類的指標查詢方法選擇器以及訊息分發表,這個過程知道查詢到繼承樹的根為止。一旦查詢到對應的選擇器,這個函式就會呼叫分發表裡對應的方法位址,傳遞飛接收者物件的資料結構。
為了加速這個訊息呼叫的過程。執行時系統會快取它們使用過的選擇器以及起對應的方法位址。這些快取是針對每個類單獨快取的,當然,這其中包含它自己定義的方法以及繼承自父類的方法。在搜尋分發表之前,訊息傳遞路由會先檢查接收訊息接收類的快取(基於如果幹過一次就很可能還會幹下一次的理論)。如果訊息選擇器存在在快取中,訊息傳遞只比直接的函式呼叫慢那麼一點點。一旦乙個程式已經跑了足夠長的時間以「預熱」他的快取,幾乎所有傳送的訊息就都可能被快取了。快取是根據程式執行時新訊息的呼叫動態增長的。
Handler訊息傳遞機制
使用方法 1.若在ui主線程中,則系統已經初始化了乙個looper物件 因為主線程也是乙個訊息迴圈,因此具有乙個looper,主線程的所有工作都是由其looper完成的looper不斷從訊息佇列中抓取訊息,然後完成訊息指定的任務 否則要自己建立乙個looper物件並啟動。我們無法通過構造器建立loo...
Handler訊息傳遞機制
android中ui並不是執行緒安全的,什麼是執行緒安全呢 這是維基給出的解釋。如果有多個執行緒操作ui,會造成執行緒不安全問題。因此android有規定 ui元件只能在activity中對ui進行操作。當乙個程式第一次啟動時,android會同時啟動乙個main thread 主線程 主要負責與u...
訊息傳遞機制之Handler機制
在專案中,都會遇見執行緒之間通訊,元件之間通訊.在應用程式中,往往會有一些比較耗時的操作 為了防止阻塞主線程 會將耗時的操作放到子執行緒中執行 處理完成後再去更新ui 但是android不允許子執行緒操作ui 違背了android單執行緒模型的原則 即ui操作不是執行緒安全的而且這些操作必須放在ui...