2014-04-23 61 views
1

有人可以提供一個具體的理由使用NSInvocation而不是隻使用一個塊,甚至是一個普通的方法調用嗎?我在網上找到了關於NSInvocation的描述,但沒有使用甚至是唯一的好選擇的例子。爲什麼我會使用NSInvocation而不是Block?

+0

NSInvocation無法像塊一樣容易地從封閉範圍捕獲值。 –

+0

你可以添加一些關於爲什麼你甚至想要交替使用它們的東西嗎?這將有助於回答者關注您的實際問題。 –

+3

僅供參考,你很少創建NSInvocations。他們傾向於只用於低級管道和諸如'forwardInvocation:'之類的東西。塊被廣泛使用。 – Chuck

回答

3

NSInvocations和塊都可以用來封裝方法調用,以及直到運行時才定義的參數和接收器。在塊存在之前,NSInvocation是執行此操作的唯一方法。如果這就是你需要做的,塊是一個更好的選擇。 NSInvocation的使用現在很少見。然而,與代表任意數量的代碼以及捕獲值的塊不同,NSInvocation總是代表單個方法調用。

這有一些優點:

  1. 不同於塊,其是不透明的,一個NSInvocation的可被查詢的選擇器,接收器,所述參數和被調用的方法的簽名。如果您接收到NSInvocation作爲方法的參數(與NSObject的-forwardInvocation一樣),則可以提取參數並調用其他方法。

  2. NSInvocation可以在運行時使用-initWithMethodSignature:爲任意方法調用構造。例如,如果你想爲Objective-C實現一個eval()函數,你可以使用NSInvocation實際調用這些方法。

+0

通過eval()函數你的意思就像在Lisp的意義上?我再次看不到任何真實世界的目的。 – user255468

+0

https://github.com/ReactiveCocoa/ReactiveCocoa/blob/master/ReactiveCocoaFramework/ReactiveCocoa/NSObject%2BRACLifting.m –

+0

或者如果你正在編寫一個模擬庫,(1)將會非常有用。 –

0

NSInvocation允許你在運行時動態構建體並調用一個Objective-C消息呼叫,到了一種方法,你可能不知道在編譯時,它可以讓你使用關於所述信息來設置參數類型和方法簽名中的參數個數,這些參數在運行時可能不會知道。 (您可能有一個地方需要能夠使用不同的簽名來調用不同的方法,並根據這些簽名傳遞不同的東西。)因此,它爲消息傳遞機制添加了一個動態性級別。我不知道塊如何與此相關。

NSInvocation也在-forwardInvocation:使用,如果你希望你的目的是能夠處理任意(不固定在編譯時)消息,在該消息調度系統構造一個NSInvocation對象描述的呼叫,並把它傳遞給你,所以您可以反思並可能修改參數並在另一個對象上調用它或以其他方式處理信息。這在運行時處理消息時增加了很多動態性。我也不知道塊如何與此相關。

相關問題