有人可以提供一個具體的理由使用NSInvocation
而不是隻使用一個塊,甚至是一個普通的方法調用嗎?我在網上找到了關於NSInvocation
的描述,但沒有使用甚至是唯一的好選擇的例子。爲什麼我會使用NSInvocation而不是Block?
回答
NSInvocations和塊都可以用來封裝方法調用,以及直到運行時才定義的參數和接收器。在塊存在之前,NSInvocation是執行此操作的唯一方法。如果這就是你需要做的,塊是一個更好的選擇。 NSInvocation的使用現在很少見。然而,與代表任意數量的代碼以及捕獲值的塊不同,NSInvocation總是代表單個方法調用。
這有一些優點:
不同於塊,其是不透明的,一個NSInvocation的可被查詢的選擇器,接收器,所述參數和被調用的方法的簽名。如果您接收到NSInvocation作爲方法的參數(與NSObject的
-forwardInvocation
一樣),則可以提取參數並調用其他方法。NSInvocation可以在運行時使用
-initWithMethodSignature:
爲任意方法調用構造。例如,如果你想爲Objective-C實現一個eval()
函數,你可以使用NSInvocation實際調用這些方法。
通過eval()函數你的意思就像在Lisp的意義上?我再次看不到任何真實世界的目的。 – user255468
https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/ReactiveCocoaFramework/ReactiveCocoa/NSObject%2BRACLifting.m –
或者如果你正在編寫一個模擬庫,(1)將會非常有用。 –
NSInvocation
允許你在運行時動態構建體並調用一個Objective-C消息呼叫,到了一種方法,你可能不知道在編譯時,它可以讓你使用關於所述信息來設置參數類型和方法簽名中的參數個數,這些參數在運行時可能不會知道。 (您可能有一個地方需要能夠使用不同的簽名來調用不同的方法,並根據這些簽名傳遞不同的東西。)因此,它爲消息傳遞機制添加了一個動態性級別。我不知道塊如何與此相關。
NSInvocation
也在-forwardInvocation:
使用,如果你希望你的目的是能夠處理任意(不固定在編譯時)消息,在該消息調度系統構造一個NSInvocation
對象描述的呼叫,並把它傳遞給你,所以您可以反思並可能修改參數並在另一個對象上調用它或以其他方式處理信息。這在運行時處理消息時增加了很多動態性。我也不知道塊如何與此相關。
- 1. NSInvocation和block之間有什麼區別?
- 2. 對於這個頁面,爲什麼我必須使用display:inline-block而不是display:inline?
- 3. 爲什麼使用display:inline-block?
- 4. 爲什麼我會使用Apache ServiceMix而不是ActiveMQ
- 5. 爲什麼我會使用白色屏幕而不是地圖?
- 6. 爲什麼Android Studio會告訴我使用getSupportActionBar()而不是getActionBar()?
- 7. 爲什麼我會使用wrappedPointCut而不是數據?
- 8. 爲什麼我會使用MockWebServer而不是WireMock?
- 9. 爲什麼我會使用check()而不是Match.test()?
- 10. 什麼使用,而不是會話?
- 11. 爲什麼margin-top與inline-block一起工作,而不是inline?
- 12. 如果我使用DOJO而不是YUI,我會失去什麼
- 13. 爲什麼bootstrap在.span上使用浮動而不是顯示:inline-block?
- 14. 爲什麼我會想用Maybe而不是List?
- 15. 爲什麼使用classmethod而不是staticmethod?
- 16. 爲什麼使用iconv_strpos而不是strpos?
- 17. 爲什麼使用registerDefaults:而不是setValue:forKey:?
- 18. 爲什麼使用TagBuilder而不是StringBuilder?
- 19. 爲什麼,而不是使用回調
- 20. 爲什麼使用結構,而不是
- 21. 爲什麼使用StringWriter而不是StringBuffer?
- 22. 爲什麼使用s:Line而不是mx:HRule?
- 23. 爲什麼使用ImageIcon而不是Image?
- 24. 爲什麼使用SQLiteOpenHelper而不是SQLiteDatabase?
- 25. 爲什麼使用MapFragment而不是SupportMapFragment?
- 26. 爲什麼使用FloatBuffer而不是float []?
- 27. 爲什麼使用追加()而不是+
- 28. 爲什麼使用Number.parseInt而不是parseInt()?
- 29. 爲什麼使用JLE而不是JL?
- 30. 爲什麼使用isinstance()而不是type()?
NSInvocation無法像塊一樣容易地從封閉範圍捕獲值。 –
你可以添加一些關於爲什麼你甚至想要交替使用它們的東西嗎?這將有助於回答者關注您的實際問題。 –
僅供參考,你很少創建NSInvocations。他們傾向於只用於低級管道和諸如'forwardInvocation:'之類的東西。塊被廣泛使用。 – Chuck