2011-03-01 36 views

回答

7
[NSClassFromString(classname) performSelector: @selector(myMethod:more:) withObject:param1 withObject:param2]; 
-1

嘗試通過類型轉換到NSClassFromString()第一id返回的值。

+0

類型從'NSClassFromString返回()'是通用的,messageable。 – bbum 2011-03-01 06:42:56

+0

'NSClassFromString()'返回值的類型是'Class',編譯器會警告有關調用Class中沒有定義的任何東西。 id是通用的,並且會使編譯器感到高興。 – 2011-03-01 06:59:19

5

快速&髒:如果myMethod:more:是唯一的,則將NSClassFromString的返回值轉換爲id。直到運行時纔會發生方法綁定,因此將調用正確的impl。

稍微更乾淨:使用NSObject的-(id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject,如果param1和param2是id s。在類對象上調用時,它也適用於類方法。

3

那麼,由於您有多個參數,您不能使用-performSelector:withObject:。你必須使用Objective-C在引擎蓋下使用的東西,objc_msgSend()。但首先你必須施展它。方法如下:

在您的實施文件(.m)中,將行#import <objc/message.h>添加到頂部。然後,您需要適當地投下objc_msgSend()。在這個例子中,我們假設param1param2是Objective-C對象,並且-myMethod:more:返回void

void (*myMsgSend)(id self, SEL _cmd, id param1, id param2); 
myMsgSend = (void(*)(id, SEL, id, id))objc_msgSend; 

一旦你投適當的話,打電話給你的新功能:

myMsgSend(obj, @selector(myMethod:more:), param1, param2); 
+0

我是否理解正確,第一行聲明變量'myMsgSend',它是指向具有'(id self,SEL _cmd,id param1,id param2)'arguments的函數的指針? – bioffe 2011-03-01 05:36:55

+0

這是正確的。 – bbum 2011-03-01 06:42:24