Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
484 views
in Technique[技术] by (71.8m points)

cocoa - Dynamically invoke a class method in Objective C

Suppose I have Objective C interface SomeClass which has a class method called someMethod:

@interface SomeClass : NSObject {
}

+ (id)someMethod;
@end

In some other interface I want to have a helper method that would dynamically invoke someMethod on a class like this:

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

What should be the implementation for invokeSelector? Is it possible at all?

- (void)invokeSelector:(SEL)aSelector forClass:(Class)aClass {
   // ???
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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:."


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...