[NSClassFromString(classname) myMethod:param1 more:param2];
使得編譯器不會發出警告說,+ myMethod的落實不到位?
[NSClassFromString(classname) myMethod:param1 more:param2];
使得編譯器不會發出警告說,+ myMethod的落實不到位?
[NSClassFromString(classname) performSelector: @selector(myMethod:more:) withObject:param1 withObject:param2];
嘗試通過類型轉換到NSClassFromString()
第一id
返回的值。
快速&髒:如果myMethod:more:是唯一的,則將NSClassFromString
的返回值轉換爲id
。直到運行時纔會發生方法綁定,因此將調用正確的impl。
稍微更乾淨:使用NSObject的-(id)performSelector:(SEL)aSelector withObject:(id)anObject withObject:(id)anotherObject
,如果param1和param2是id
s。在類對象上調用時,它也適用於類方法。
那麼,由於您有多個參數,您不能使用-performSelector:withObject:
。你必須使用Objective-C在引擎蓋下使用的東西,objc_msgSend()
。但首先你必須施展它。方法如下:
在您的實施文件(.m
)中,將行#import <objc/message.h>
添加到頂部。然後,您需要適當地投下objc_msgSend()
。在這個例子中,我們假設param1
和param2
是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);
類型從'NSClassFromString返回()'是通用的,messageable。 – bbum 2011-03-01 06:42:56
'NSClassFromString()'返回值的類型是'Class',編譯器會警告有關調用Class中沒有定義的任何東西。 id是通用的,並且會使編譯器感到高興。 – 2011-03-01 06:59:19