假设我有Objective C接口SomeClass
,它有一个名为someMethod
的类方法:
@interface SomeClass : NSObject {
}
+ (id)someMethod;
@end
在其他一些接口中,我希望有一个辅助方法,可以在类这样的类上动态调用someMethod
:
[someOtherObject invokeSelector:@selector(someMethod) forClass:[SomeClass class];
invokeSelector
的实施应该是什么?它有可能吗?
- (void)invokeSelector:(SEL)aSelector forClass:(Class)aClass {
// ???
}
答案 0 :(得分:83)
而不是:
[someOtherObject invokeSelector:@selector(someMethod) forClass:[SomeClass class];
呼叫:
[[SomeClass class] performSelector:@selector(someMethod)];
示例(使用GNUstep ...)
档案A.h
#import <Foundation/Foundation.h>
@interface A : NSObject {}
- (NSString *)description;
+ (NSString *)action;
@end
文件A.m
#import <Foundation/Foundation.h>
#import "A.h"
@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
“在Objective-C中,类对象获取所有实例方法 其层次结构的根类。这意味着每个类对象 从NSObject下降得到所有NSObject的实例方法 - 包括performSelector:。“
答案 1 :(得分:4)
在Objective-C中,类也是对象。但是,类对象的处理方式不同,因为它们可以在Cocoa中调用其根类的实例方法(NSObject
或NSProxy
。)
因此,可以在类对象上使用NSObject
中定义的所有实例方法,并且动态调用类方法的正确方法是:
[aClass performSelector:@selector(aSelector)];
apple docs更具体一些。
答案 2 :(得分:2)
你不应该自己实现这个。
NSObject协议有一个performSelector:
方法就是这样做的。
答案 3 :(得分:2)
这种内置方法你想要的是什么?
id objc_msgSend(id theReceiver, SEL theSelector, ...)
(有关此功能,请参阅runtime reference docs。)