соединение и пользование библиотекой C++ с приложением Objective C

Попробуйте JavaScript в [1 116] оператор .

if ('key' in myObj)

И инверсия.

if (!('key' in myObj))

Быть осторожным! in оператор соответствует всем объектным ключам, включая тех в цепочке прототипа объекта.

Использование myObj.hasOwnProperty('key') для проверки собственных ключей объекта и только возвратится true, если key будет доступно на myObj непосредственно:

myObj.hasOwnProperty('key')

, Если у Вас нет определенной причины использовать in, оператор, с помощью myObj.hasOwnProperty('key') приводит к результату, который ищет большая часть кода.

9
задан Quinn Taylor 5 August 2009 в 18:50
поделиться

2 ответа

Вы столкнетесь с одним препятствием в виде того, что называется «искажением имени». C ++ хранит имена функций способом, несовместимым с Obj-C.

Objective-C не реализует классы так же, как C ++, поэтому ему это не понравится.

Один из способов обойти это - реализовать набор простых функций C, которые вызывают функции C ++. Будет хорошей задачей сохранить как можно меньшее количество функций C! У вас получится красивый компактный интерфейс! :)

Чтобы объявить эти функции в файле C ++, вам нужно пометить их как C с помощью:

extern "C" int function_name(char *blob,int number, double foo) {...}

Это отключает стандартное изменение имен.

Создайте файл заголовка с прототипами для всех этих функций которым вы можете поделиться со своим объективным кодом C.

Вы выиграли '

14
ответ дан 4 December 2019 в 07:35
поделиться

Большинство проектов, над которыми я работаю, имеют интерфейс ObjC и серверную часть C ++. Если вы имеете дело исключительно с функциями, то исправление искажения имени Дейва Гэмбла является правильным, но если вы имеете дело с более сложными ситуациями, когда вам нужно иметь дело как с объектами ObjC, так и с объектами C ++, лучше всего обернуть объекты C ++ в объектах ObjC. Используя непрозрачные ссылки (что является очень причудливым способом сказать void * ), вы действительно можете передавать объекты C ++ в ObjC и наоборот. У меня есть пример кода , который может быть полезен.

Тем не менее, для графики вы, вероятно, серьезно пострадаете от выполнения пользовательского C ++ вместо использования Core Image и связанных фреймворков. Core Image и другие графические фреймворки оптимизированы для Mac, и вы Вряд ли вы добьетесь большего успеха с ручным C ++ (или даже с очень хорошо написанным C ++, который не предназначен специально для Mac). При переходе на версию 10.6 и grand central dispatch разница в производительности станет еще более заметной, потому что вы потеряете все преимущества распараллеливания, которые в противном случае получили бы бесплатно. Это не имеет ничего общего с ObjC; Core Image - это C. Вы можете называть его из C ++ как угодно. Я просто не рекомендую настраивать обработку графики на Mac на любом языке, если вам не нужна переносимость или у вас нет опыта, необходимого для победы над Core Image.

Вы потеряете все преимущества распараллеливания, которые в противном случае получили бы бесплатно. Это не имеет ничего общего с ObjC; Core Image - это C. Вы можете называть его из C ++ как угодно. Я просто не рекомендую настраивать обработку графики на Mac на любом языке, если вам не нужна переносимость или у вас нет опыта, необходимого для победы над Core Image.

Вы потеряете все преимущества распараллеливания, которые в противном случае получили бы бесплатно. Это не имеет ничего общего с ObjC; Core Image - это C. Вы можете называть его из C ++ как угодно. Я просто не рекомендую настраивать обработку графики на Mac на любом языке, если вам не нужна переносимость или у вас нет опыта, необходимого для победы над Core Image.

15
ответ дан 4 December 2019 в 07:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: