动态调用Objective C中的类方法

时间:2009-11-23 04:04:34

标签: objective-c cocoa cocoa-touch

假设我有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 {
   // ???
}

4 个答案:

答案 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

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

“在Objective-C中,类对象获取所有实例方法 其层次结构的根类。这意味着每个类对象 从NSObject下降得到所有NSObject的实例方法 - 包括performSelector:。“

答案 1 :(得分:4)

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

因此,可以在类对象上使用NSObject中定义的所有实例方法,并且动态调用类方法的正确方法是:

[aClass performSelector:@selector(aSelector)];

apple docs更具体一些。

答案 2 :(得分:2)

你不应该自己实现这个。

NSObject协议有一个performSelector:方法就是这样做的。

答案 3 :(得分:2)

这种内置方法你想要的是什么?

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

(有关此功能,请参阅runtime reference docs。)