代码之家  ›  专栏  ›  技术社区  ›  GregK

在目标C中动态调用类方法

  •  41
  • GregK  · 技术社区  · 15 年前

    假设我有目标C接口 SomeClass 它有一个类方法 someMethod :

    @interface SomeClass : NSObject {
    }
    
    + (id)someMethod;
    @end
    

    在其他一些接口中,我希望有一个可以动态调用的helper方法 多种方法 在这样的课堂上:

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

    实现的目的应该是什么 invokeSelector ?有可能吗?

    - (void)invokeSelector:(SEL)aSelector forClass:(Class)aClass {
       // ???
    }
    
    4 回复  |  直到 7 年前
        1
  •  83
  •   shim    9 年前

    而不是:

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

    呼叫:

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

    示例(使用gnustep…)

    文件AH

    #import <Foundation/Foundation.h>
    @interface A : NSObject {}
    
    - (NSString *)description;
    + (NSString *)action;
    @end
    

    文件编号

    #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的所有实例方法- 包括性能选择器:“

        2
  •  4
  •   Adrian    15 年前

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

    因此可以使用中定义的所有实例方法 NSO对象 对于类对象,动态调用类方法的正确方法是:

    [aClass performSelector:@selector(aSelector)];
    

    这个 apple docs 更具体一点。

        3
  •  2
  •   Ben S    15 年前

    你不应该自己实现这个。

    nsObject协议具有 performSelector: 方法。

        4
  •  2
  •   Cameron Lowell Palmer    7 年前

    这个内置方法是你想要的吗?

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

    (见 runtime reference docs 用于此功能。)