我真的不明白ObjC如何有效地依賴消息。這是否意味着像mach這樣的內核必須用這個想法來設計?目標C似乎是一種很好的語言,但我找不到比C++更容易掌握的東西。目標C中的消息系統是否依賴於內核消息系統?
如何在語言中構建消息系統是一個優勢?
我真的不明白ObjC如何有效地依賴消息。這是否意味着像mach這樣的內核必須用這個想法來設計?目標C似乎是一種很好的語言,但我找不到比C++更容易掌握的東西。目標C中的消息系統是否依賴於內核消息系統?
如何在語言中構建消息系統是一個優勢?
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中的馬赫內核中使用)
Objective-C的消息沒有內置到內核,它是建設成Objective-C的運行時間。
大部分魔術都是在一個名爲objc_msgSend()
的函數中完成的。如果你寫一個Objective-C代碼是這樣的:
[myObject doStuffWith:something];
編譯器實際上會產生相同的代碼,如果你輸入了這一點:
objc_msgSend(myObject, @selector(doStuffWith:), something);
的objc_msgSend()
實現相當快速和智能。通過緩存經常使用的選擇器來快速實現,而且它的靈活性在於它允許儘可能晚的實現解決方案。實際上,objc_msgSend()
是爲查找實際實現的選擇器進行哈希查找。
一個優點是,你在這裏的是,如果一個方法的實現是沒有找到,則該對象可以在運行時可以:
帶代碼的動態類型化語言最明顯的優勢就是您在代表中看到的優勢。正如您可能已經注意到的,例如UITableViewDelegate
協議;並非所有的方法都是根據需要聲明的
這允許客戶端遵從(實現)協議來簡單地根本不實現委託方法來推斷默認行爲。而在例如Java中,除了接口之外,通常還有一個抽象默認實現FooAdapter
,其實現了接口中每個方法的默認實現。
速度怎麼樣?如果大部分工作都是在C++編譯時完成的,那意味着它會更加期待並且因此更快......我是對的嗎? (我正在學習視頻遊戲編程,所以我真的堅持速度) – jokoon 2010-11-25 16:19:18