2010-11-25 166 views

回答

2

Objective-C中的消息傳遞與mach內核中的消息傳遞沒有直接關係。它被實現爲一個高度調整的函數,稱爲objc_msgSend。呼叫

[obj messageWithX:x andY:y]; 

被轉換到C呼叫

objc_msgSend(obj,@selector(messageWithX:andY:),x,y); 

objc_msgSend用匯編語言直接寫入被最大優化。它以一種非常有效的方式動態地解析了方法調用。 This blog post將是理解它如何實現的好地方。

不管是比C++更容易還是更難掌握,將取決於你的背景和你的口味。 C++和Objective-C支持的面向對象的風格有很大不同,因此很難進行比較。

Objective-C的消息傳遞系統是高度動態的,大部分決策都可以在運行時完成。 C++的成員函數調用系統更加靜態,並且儘可能在編譯時做到這一點。的Objective-C中的動力學性質

一個好處是,你可以在運行時更改類的系統,但是這並不一定相關消息的性質。例如,根據我的理解,mach中的消息傳遞系統並不這樣做。

一個直接相關的消息傳遞性質的特點是,一個對象可以捕獲一個消息,其它不理解的,然後將其轉發給其它對象。這可以在mach中完成:消息的接收者可以在內核空間中,在用戶空間中,或者在另一臺機器中,並且消息的發送者不需要關心它。這增加了設計內核的更多靈活性。 (但此功能未在OS X中的馬赫內核中使用)

+0

速度怎麼樣?如果大部分工作都是在C++編譯時完成的,那意味着它會更加期待並且因此更快......我是對的嗎? (我正在學習視頻遊戲編程,所以我真的堅持速度) – jokoon 2010-11-25 16:19:18

2

Objective-C的消息沒有內置到內核,它是建設成Objective-C的運行時間。

大部分魔術都是在一個名爲objc_msgSend()的函數中完成的。如果你寫一個Objective-C代碼是這樣的:

[myObject doStuffWith:something]; 

編譯器實際上會產生相同的代碼,如果你輸入了這一點:

objc_msgSend(myObject, @selector(doStuffWith:), something); 

objc_msgSend()實現相當快速和智能。通過緩存經常使用的選擇器來快速實現,而且它的靈活性在於它允許儘可能晚的實現解決方案。實際上,objc_msgSend()是爲查找實際實現的選擇器進行哈希查找。

一個優點是,你在這裏的是,如果一個方法的實現是沒有找到,則該對象可以在運行時可以:

  • 推遲,以充當調用另一個對象代理。
  • 動態地對選擇器進行操作。
  • 將實現動態綁定到先前未知的選擇器。

帶代碼的動態類型化語言最明顯的優勢就是您在代表中看到的優勢。正如您可能已經注意到的,例如UITableViewDelegate協議;並非所有的方法都是根據需要聲明的

這允許客戶端遵從(實現)協議來簡單地根本不實現委託方法來推斷默認行爲。而在例如Java中,除了接口之外,通常還有一個抽象默認實現FooAdapter,其實現了接口中每個方法的默認實現。