Instead of:
[someOtherObject invokeSelector:@selector(someMethod) forClass:[SomeClass class];
call:
[[SomeClass class] performSelector:@selector(someMethod)];
Example (using GNUstep ...)
file A.h
#import <Foundation/Foundation.h>
@interface A : NSObject {}
- (NSString *)description;
+ (NSString *)action;
@end
file 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
Somewhere else:
A *a = [[A class] performSelector:@selector(action)];
NSLog(@"%@",a);
Output:
2009-11-22 23:32:41.974 abc[3200] A::action
nice explanation from http://www.cocoabuilder.com/archive/cocoa/197631-how-do-classes-respond-to-performselector.html:
"In Objective-C, a class object gets all the instance methods of the
root class for its hierarchy. This means that every class object
that descends from NSObject gets all of NSObject's instance methods -
including performSelector:."
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…