Objective-C相当于Ruby的#define_method?

时间:2009-02-17 02:07:18

标签: objective-c

是否可以像在Ruby中一样动态定义Objective-C中的方法?

[:failure, :error, :success].each do |method|
 define_method method do
    self.state = method
  end
end

2 个答案:

答案 0 :(得分:3)

实际上可以这样做,虽然obj-c语法不支持它,但是obj-c运行时提供了可以执行此操作的函数。你想要的是class_addMethod,但是我不记得具体的具体细节。所有运行时方法都记录在developer.apple.com

为了它的地狱我打了一个非常简单的例子

#import <objc/objc-class.h>

@interface MyClass : NSObject {
}
@end

@implementation MyClass
@end

id myMethod(id self, SEL cmd, NSString* message)
{
    NSLog(message);
    return nil;
}

int main(int argc, char *argv[])
{

    class_addMethod([MyClass class], @selector(newMethod:), (IMP)myMethod, "v@:#");
    [[[MyClass alloc] init] newMethod:@"Hello World"];
    return 0;
}

现在严格来说,我认为myMethod应该是varargs,而且恰好可以像我在x86上那样做,并且可能在ppc上失败 - 但是那时我可能是错的。

here's the awful type encoding docs

答案 1 :(得分:0)

我不相信它是可能的,因为目标C毕竟是一种编译语言。你的“定义方法”必须向表中添加方法,并有办法在运行时编译方法。