Как использовать переменную C / Obj-C в MacRuby? - PullRequest
0 голосов
/ 21 марта 2012

Я объявил переменную функцию / метод в классе Obj-C следующим образом:

@interface Foo
+ (void) print: (id) firstMessage, ...;
@end

@implementation
+ (void) print: (id) firstMessage, ...{
    va_list ap
    va_start (ap, firstMessage)
    for (id message = firstMessage; message != nil; message = va_arg(ap, id)){
        NSLog(@"message: %@", message);
    }
    va_end(ap)
}
@end

Это работает при вызове функции Obj-C следующим образом:

[Foo print: @"Hello, world.", @"I'm Xavier.", nil];

Консоль выдаст:

=> Hello, world.
=> I'm Xavier.

Но это не работает, когда я вызываю вызов функции в MacRuby:

Foo.print (@"Hello, world.", @"I'm Xavier.", nil)

Затем консоль печатает:

=> Hello, world.
=> Hello, world.
=> (lldb)

Да, первое сообщение печатается дважды! И тогда это терпит крах.

Я обнаружил, что назначение "message = va_arg (ap, id)" не работает. Сообщение obj не изменяется. Я думал, что это может быть проблема в MacRuby (версия 0.10).

Я думал, что MacRuby принимает только первый аргумент и передает его в метод Obj-C. Не так ли? Я не прав?

1 Ответ

1 голос
/ 19 мая 2012

Вам потребуется сгенерировать файл поддержки моста для вашего класса Objective-C.

Как?

Чтобы узнать подробности о том, как это сделать, прочитайте страницу руководства дляgen_bridge_metadata.Если ваш класс Obj-C является частью фреймворка, использование метода framework в MacRuby также будет включать правильный файл поддержки моста.Если вы осуществляете прямые ссылки, вам может потребоваться использовать Kernel.load_bridge_support_file.

Почему?

MacRuby не может определить из метаданных времени выполнения, является ли метод вариативным.Это, в сочетании с тем фактом, что вариационные методы имеют другое соглашение о вызовах, чем невариадические, означает, что MacRuby всегда будет аварийно завершать работу при вызове метода с переменным числом, если ему заранее не сообщают, что ему нужно использовать соглашение о вызове с переменным числом.Это то, что обеспечивает поддержка моста.

...