2013-08-16 40 views
3

語境:resolveInstanceMethod未知數量的參數

我有一個依賴注入容器 - www.typhoonframework.org

它允許使用接口定義組件在運行時間來解決這些問題 - 使用resolveInstanceMethod和使用Block來實現對DI容器的請求蹦牀。

用戶一直在要求在運行時提供一些參數。例如:

[assembly dangerousEnemyWithWeapon:id<BigGun>] 

。 。敵人由DI容器中的協作類組裝而成,但槍在運行時提供。 。 。

問題:

是否有可能使用resolveInstanceMethod以定義參數的數目是不知道前面的實現?

我想打包這些參數,並將它們轉發給另一個響應者。

參數可以按順序打包或添加到字典中,匹配的選擇器部分作爲關鍵字。

+0

你看過'forwardingTargetForSelector:'?它比'resolveInstanceMethod:'慢,但比'forwardInvocation:'快得多。也許它會滿足你的需求。 –

+0

感謝您的建議Rob。 。我想將選擇器和參數翻譯爲[container componentForKey:key withArguments:]。 。很好地瞭解該方法的性能特徵 - 這可能很重要。 –

+0

什麼是「鑰匙」?你知道你想轉發消息的對象的類嗎? –

回答

5

您不能使用+resolveInstanceMethod:,但您可以使用傳統轉發。 +resolveInstanceMethod:只是使用Objective-C運行時在類上安裝新的實例方法。你不會影響它的調用方式。它會像調用者提供的參數一樣在寄存器和堆棧中與其他方法一樣被調用。你沒有機會打包或編組論據。

如果實施-forwardInvocation:-methodSignatureForSelector:,則會得到一個NSInvocation對象。這已經是參數的包裝(和返回值)。你可以直接使用它,或者詢問它來解開參數並重新包裝你想要的東西。

+0

謝謝Ken。 。我已經使用resolveInstance方法來實現其他功能,但我認爲我可以將其轉換爲使用forwardInvocation。 。 –

+0

'forwardInvocation:'遠遠比'resolveInstanceMethod:'慢。只是FYI。 –

+0

我得到了我的原始用例來處理forwardInvocation而不是resolveInstanceMethod。 。我認爲這對我有用。 。但是,性能可能是一個問題。 –