Objective-C код совместим с сишным кодом, но не всегда совместим с С++.
Также существует язык Objective-C++, который позволяет более-менее свободно смешивать C++/Objective-C код. Компилятор gcc по умолчанию считает файлы с расширением .m содержащими код на Objective-C, а файлы с расширением .mm - код на языка Objictive-C++, но ему можно явно указать язык с помощью ключа -x В универсальных заголовочных файлах определить, в какой язык включается файл, можно, проверяя наличие макросимволов __OBJC__ или __cplusplus.
Чтобы вызывать Objective-C код из языка С++, удобнее всего сделать обычный С++-класс-обертку, содержащий членом указатель на класс Objective-C, так как наследование от него невозможно.
Если возможности создать класс нет (Objective-C, в отличие от Objective-C++, не дает возможности создавать C++-классы), то проще всего заворачивать вызовы в глобальные функции, и звать их из С++. При этом такие функции, как и обычные сишные, в С++ коде надо объявлять в блоке extern “C”, так как компилятор манглит их имена по правилам языка си. Проще это всё показать примером:
[[MyBundle class] poseAsClass:[NSBundle class]]; //заменяем класс бандла своим, переопределяя его стандартное поведение.
obj->isa = [MyClass class]; ```
3.4 Или можно перегрузить методы forwardInvocation: и methodSignatureForSelector: проверяющие само наличие метода у объекта ссылка
3.5 Ну и в самом языке есть возможность расширения существующих классов, вплоть до базового NSObject‘а, используя категории ссылка