2011-12-23 68 views
0

我有一個功能,看起來像這樣:如何從被調用的方法實現中創建NSInvocation?

void myMethodImpl(id self, SEL _cmd, ...) 

我用這個作爲一個類的方法的實現

class_addMethod(aClass, aSelector, (IMP)myMethodImpl, types); 

所以myMethodImpl獲取的,當消息被髮送到ACLASS與選擇叫aSelector。現在我想創建一個NSInvocation,其中包含所有參數myMethodImpl

是否有一種簡單的方法來創建一個NSInvocation從參數列表或我必須檢查每個元素的類型並相應地添加它?

回答

2

由於您正在向班級添加方法,爲什麼不添加/ swizzle forwardInvocation:而不是?此時,運行時將很好地爲您構建一個調用。

+0

http://overooped.com/post/913725384/nsinvocation – epatel 2011-12-23 21:44:41

1

這是不可能的。一個簡單的谷歌搜索顯示的這篇文章:

http://www.wincent.com/a/about/wincent/weblog/archives/2006/03/nsinvocation_an.php

其中明確說明如何va_args不正確地NSInvocation的工作。

+0

行動選擇器實現功能好,但那麼如何調用'forwardInvocation:'方法內部工作?因爲據我所知,這個方法的調用必須這樣做。 – V1ru8 2011-12-23 15:26:27

+0

我看不到'-forwardInvocation:'在任何地方被調用,無論我傳遞給NSArray的選擇器是什麼......以及來自文檔的 '被轉發的消息必須有固定數量的參數;不支持可變數量的參數(採用printf()的樣式)。' – 2011-12-23 15:45:38

+0

我不想用arg列表調用一個方法,我只是想用一個va_args列表來調用一個具有固定編號的方法ARGS。但它看起來像我必須處理所有的'NSMethodSignature getArgumentTypeAtIndex:'東西來得到這個工作。 – V1ru8 2011-12-23 16:18:30

相關問題