我到處讀到Objective-C具有真正的動態綁定,其中C++只有Late綁定。不幸的是,沒有一本書能夠清楚地解釋它或者討論底層的實現。例如C++使用虛擬表。 Objective-C如何?延遲綁定vs動態綁定
3
A
回答
7
http://www.gnu.org/software/gnustep/resources/ObjCFun.html有一個很不錯的描述。
基本上動態綁定的意思是,在實際進行方法調用時,決定調用哪個方法。如果您願意,該方法可以在那時動態選擇。
編輯:這裏有更多的細節,以我的最佳理解。我不保證這是完全正確的,但它應該是正確的。 Objective C中的每個對象都是一個結構,其第一個成員名爲isa
,是一個指向類的指針。每個類本身就是傳統奠定了作爲一個對象:
struct objc_class {
Class isa;
Class super_class;
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
struct objc_method_list **methodLists;
struct objc_cache *cache;
struct objc_protocol_list *protocols;
};
在運行時,這裏是僞代碼的一個方法查找發生了什麼:
Follow isa to find the class
if implementation = class.lookup_method(method):
call implementation
else if get_implementation = class.lookup_method(forwardInvocation):
implementation = get_implementation(method)
if implementation:
call implementation
else:
raise runtime error
else:
raise runtime error
而且這是如何lookup_method
工作?
def lookup_method (class, method):
if method in class.objc_cache:
return implementation from objc_cache
else if method in class.objc_method_list:
cache implementation from objc_method_list
return implementation
else if implementation = class.super_class.lookup_method(method):
cache implementation
return implementation
else:
return null
爲了迴應這個明顯的問題,是的,這比C++的虛擬錶慢得多。根據基準,約三分之一的速度。每一個客觀的C文本都緊隨其後,在現實世界中,方法查找速度幾乎不是瓶頸。
這比C的方法查找靈活得多。例如,您可以使用forwardInvocation
使無法識別的方法轉到您在變量中擁有的對象。這種委派可以在不知道該對象的類型在運行時會被使用的情況下完成,或者它將支持哪些方法。您也可以將方法添加到類中 - 即使在運行時也是如此 - 無需訪問源代碼。對類和方法也有豐富的運行時反省。
明顯的缺點是,任何C++程序員都會在上下跳動,因爲你已經拋棄了編譯時類型檢查的任何希望。
這是否解釋了差異,並給你足夠的細節來了解正在發生的事情?
0
實際上,動態綁定和後期綁定都是相同的。在我們有靜態綁定或早期綁定,它檢查在編譯時發生的問題(有關變量,表達式等的錯誤),這些信息存儲在一個v-表(虛擬方法表)中。後期綁定所做的只是將方法與v表中的方法綁定在一起。
相關問題
- 1. 綁定延遲
- 2. ngModel上的延遲綁定
- 3. 延遲綁定Outlook PIA
- 4. 動態範圍界定 - 深度綁定vs淺綁定
- 5. 導致UI延遲的Datagrid綁定(WPF)
- 6. 主機綁定不上延遲加載
- 7. java.lang.RuntimeException:GWT中的延遲綁定錯誤
- 8. 獲得UsedRange與延遲綁定
- 9. GWT延遲綁定的問題
- 10. GWT RPC延遲綁定失敗
- 11. 延遲綁定模型與ObjectProxy
- 12. VB.NET接口/延遲綁定排序
- 13. 綁定模板角度前的延遲
- 14. 問題與jQuery鍵綁定延遲iframes?
- 15. 動態綁定VS類型推斷
- 16. WPF動態綁定
- 17. 動態綁定MenuItems
- 18. 動態綁定WPF
- 19. 動態綁定RadGrid
- 20. C++動態綁定
- 21. GWT延期綁定
- 22. Flex MXML綁定vs Actionscript綁定
- 23. c + +動態綁定和java動態綁定有什麼區別?
- 24. 變量綁定VS多態中的方法綁定
- 25. 靜態和動態綁定
- 26. 綁定:WPF vs WinForms
- 27. 靜態類型綁定與動態類型綁定
- 28. 靜態綁定和動態綁定用例
- 29. Vue.js禁用動態綁定?
- 30. C++中的動態綁定
你能舉個例子嗎?你的答案與任何教科書一樣模糊 – 2011-05-10 05:21:08
@ vinod-james:我已經添加了很多關於實際使用機制的細節。 – btilly 2011-05-10 07:20:31