2012-02-20 62 views
1

如果我的邏輯錯誤,請糾正我。關於objc運行時的疑問

在java中我們可以這樣調用

Object.doSomething(); // here we call method directly 

方法在objc我們做

[object doSomething]; 

這裏DoSomething的消息被髮送到對象。據我所知,每個對象都有一個指向對象類的指針。 Objc運行時使用該指針來檢查對象類是否有這樣的方法如果沒有,檢查它的父級等。如果找到一個方法objc_msgSend被調用。

這裏我很困惑。

Java中的方法調用和Objc中的消息之間有什麼區別?

他們之間有什麼優勢/劣勢?

回答

0

消息路由在運行時完成(objc) - 在編譯時(java)的方法綁定。 objc運行時會在運行時解析該方法,並可能會在類/超類中找到某些內容,將其轉發給某個其他對象(forwardInvocation)或失敗(未找到方法)。這就是爲什麼objc ppl談論消息(動態)和java ppl談論方法(靜態)。優點是更多的動態行爲是可能的運行時錯誤的缺點。

+0

Java方法調用實際上並未在編譯時綁定。反思和其他事情可以改變方法調用發生的情況,所以這個答案實際上是無效的。 – 2012-08-30 14:37:18

3

你對objc_msgSend的工作原理感到困惑,objc_msgSend本身就是發送消息的東西,所以沒有檢查該類是否首先包含該方法。這由發送框架處理。這允許消息在運行時被類重新路由,如NSProxy