Objective-C 相当于 Ruby 的#define_method?

标签 objective-c

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

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

最佳答案

实际上可以做到这一点,尽管 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

关于Objective-C 相当于 Ruby 的#define_method?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/555298/

相关文章:

ios - 尝试从类文件创建按钮时找不到属性 View

ios - 当您点击 iOS 主屏幕上的应用程序图标时,如何制作应用程序启动之类的动画?

iphone - 使用核心数据生成的类作为模型对象……?

iphone - iOS 自定义字体

ios - 按下指向 TableView 的按钮时应用程序崩溃

iphone - OpenGL ES 光照问题

iOS Airprint 不显示弹出对话框

objective-c - iphone 中的文本下划线

ios - 在不打开切换器面板的情况下直接从 Springboard 关闭所有应用程序?

ios - 从一个上下文到另一个上下文使用 NSManagedObjectID 是否安全?