Dynamically invoke a class method in Objective C

后端 未结 4 1855
感情败类
感情败类 2020-12-08 04:09

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

@interface SomeClass : NSObject {
}

         


        
4条回答
  •  渐次进展
    2020-12-08 04:42

    Instead of:

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

    call:

    [[SomeClass class] performSelector:@selector(someMethod)];
    

    Example (using GNUstep ...)

    file A.h

    #import 
    @interface A : NSObject {}
    
    - (NSString *)description;
    + (NSString *)action;
    @end
    

    file A.m

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

提交回复
热议问题