在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的运行时参考文档 。)