Эта информация требуется для кодировки типов, используемой средой выполнения Objective C, и является частью работы динамической диспетчеризации. Его можно получить, опросив среду выполнения:
Ivar *ivars = class_copyIvarList([Test class], NULL);
printf("%s\n", ivar_getTypeEncoding(ivars[1]));
free(ivars); ivars = NULL;
Чтобы устранить это, вам следует избегать размещения типов C ++ непосредственно в объекте ObjC. Вы можете немного уменьшить многословие с помощью бокса:
class Box {
std::vector<int> _vector;
std::unordered_map<int, std::vector<std::string> > *_map;
};
@interface Test: NSObject {
Box box;
}
@end
Урожайность
{Box="_vector"{vector<int, std::__1::allocator<int>
>="__begin_"^i"__end_"^i"__end_cap_"{__compressed_pair<int *,
std::__1::allocator<int> >="__value_"^i}}"_map"^{unordered_map<int,
std::__1::vector<std::__1::basic_string<char>,
std::__1::allocator<std::__1::basic_string<char> > >, std::__1::hash<int>,
std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<const int,
std::__1::vector<std::__1::basic_string<char>,
std::__1::allocator<std::__1::basic_string<char> > > > > >}}
И указатель на поле немного меньше:
^{Box={vector<int, std::__1::allocator<int> >=^i^i{__compressed_pair<int *,
std::__1::allocator<int> >=^i}}^{unordered_map<int,
std::__1::vector<std::__1::basic_string<char>,
std::__1::allocator<std::__1::basic_string<char> > >, std::__1::hash<int>,
std::__1::equal_to<int>, std::__1::allocator<std::__1::pair<const int,
std::__1::vector<std::__1::basic_string<char>,
std::__1::allocator<std::__1::basic_string<char> > > > > >}}
И, конечно, вы можете пойти дальше, сделав рамку void *
и приведя ее по мере необходимости, или, возможно, скрыв ее за более простым типом C ++ и pimpl (я не пробовал этот подход, чтобы увидеть, работает ли он) , Но если вы поместите C ++ (или что-то еще) непосредственно в ивар ObjC, он должен сохранить имя типа для среды выполнения.