在Objective C中dynamic调用一个类方法

假设我有ObjectiveC接口SomeClass ,它有一个叫做someMethod的类方法:

 @interface SomeClass : NSObject { } + (id)someMethod; @end 

在其他一些接口中,我希望有一个帮助器方法,可以像这样dynamic地调用someMethod方法:

 [someOtherObject invokeSelector:@selector(someMethod) forClass:[SomeClass class]; 

什么应该是invokeSelector的实现? 有没有可能?

 - (void)invokeSelector:(SEL)aSelector forClass:(Class)aClass { // ??? } 

代替:

 [someOtherObject invokeSelector:@selector(someMethod) forClass:[SomeClass class]; 

呼叫:

 [[SomeClass class] performSelector:@selector(someMethod)]; 

示例(使用GNUstep …)

档案啊

 #import <Foundation/Foundation.h> @interface A : NSObject {} - (NSString *)description; + (NSString *)action; @end 

文件Am

 #import <Foundation/Foundation.h> #import "Ah" @implementation A - (NSString *)description { return [NSString stringWithString: @"A"]; } + (NSString *)action { return [NSString stringWithString:@"A::action"]; } @end 

别的地方:

 A *a = [[A class] performSelector:@selector(action)]; NSLog(@"%@",a); 

输出:

 2009-11-22 23:32:41.974 abc[3200] A::action 

好的解释从http://www.cocoabuilder.com/archive/cocoa/197631-how-do-classes-respond-to-performselector.html

“在Objective-C中,一个类对象为它的层次结构获取了根类的所有实例方法,这意味着从NSObject派生的每个类对象都获得了NSObject的所有实例方法,包括performSelector:

在Objective-C中,类也是对象。 然而,类对象的处理方式不同,因为它们可以调用其根类的实例方法( NSObject或Cocoa中的NSProxy )。

所以有可能在类对象中使用NSObject定义的所有实例方法,dynamic调用类方法的正确方法是:

 [aClass performSelector:@selector(aSelector)]; 

苹果文档有点更具体。

你不应该自己实现这个。

NSObject协议有一个performSelector:方法,正是这个。

这个内置的方法是你想要的吗?

 id objc_msgSend(id theReceiver, SEL theSelector, ...) 

(请参阅此function的运行时参考文档 。)