Objective-C эквивалентен #define_method Руби? - PullRequest
2 голосов
/ 17 февраля 2009

Можно ли динамически определять методы в Objective-C, как в Ruby?

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

Ответы [ 2 ]

3 голосов
/ 17 февраля 2009

На самом деле это можно сделать, хотя это не поддерживается синтаксисом 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 - но тогда я могу ошибаться.

О Вот ужасные документы по кодированию типов

0 голосов
/ 17 февраля 2009

Я не верю, что это возможно, потому что Objective C, в конце концов, является скомпилированным языком. Ваш "метод определения", который должен добавлять методы в таблицу и иметь возможность компилировать метод во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...