Вызов API какао из C - PullRequest
       1

Вызов API какао из C

12 голосов
/ 05 мая 2011

Я не знаю, возможно ли это, но имея код на простом C, можно ли вызывать API-интерфейсы Какао из него?
Что-то вроде #include <cocoa.h>, добавить соответствующую библиотеку и пойти на это?

Спасибо за помощь

Ответы [ 2 ]

14 голосов
/ 05 мая 2011

Если вы ссылаетесь на фреймворки Cocoa или Foundation, вы можете использовать target-c в вашем C-коде. Однако, если вы хотите использовать обычный синтаксис обмена сообщениями, вам придется изменить расширение файла с .c на .m, чтобы оно компилировалось как target-c. Если вы сохраните расширение .c, вы сможете использовать только вызовы времени выполнения в стиле c для взаимодействия с объектами-объектами (т.е. objc_msgSend, objc_getClass и т. Д.).

Примеры: в файле .m

void cFunction() {
    [[NSString alloc] init];
}

В файле .c

void cFunction() {
    void* cls = objc_getClass("NSString");
    void* obj = objc_msgSend(cls, NSSelectorFromString(CFSTR("alloc")));
    obj = objc_msgSend(obj, NSSelectorFromString(CFSTR("init")));
}

Если вы выберете второй метод, см. Справочник по Objective-C Runtime .

4 голосов
/ 05 мая 2011

Objective-C - очень тонкая оболочка над C. Компилятор просто переводит

 [obj message:argument];

в C-вызов

 obj_msgSend(obj,@selector(message:),argument);

и все (где @selector(message:) это волшебная кодировка, превращающая селектор (имя метода) в понятную компьютеру штуку.)

Таким образом, между Objective-C и C нет большой разницы с точки зрения компилятора.Например, вы можете скомпилировать чистую программу на C с помощью компилятора Objective-C, и результат будет точно таким же, как и при компиляции с помощью C-компилятора.

Итак, самый простой способ «смешать» немного Objective-C с C - это использовать расширение .m, чтобы компилятор использовал Objective-C.

Это не делает вашу программу неожиданно очень Objective-Cy.Вы можете сохранить свою программу почти на чистом C с расширением .m.m вы можете без проблем добавить несколько строк вызовов сообщений Objective C.

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