Ios 为什么Objective-C包含完整的C++;在二进制文件中键入字符串形式的名称?我能把它处理掉吗? 当我将C++类型添加为Objul-C IVAR时,我得到了包含的类型的全名,作为字符串: @interface Test { std::vector<int> _vector; std::unordered_map<int, std::vector<std::string>> _map; } @end @implementation Test @end @接口测试{ std::vector\u vector; std::无序的_图_图; } @结束 @实施测试 @结束

Ios 为什么Objective-C包含完整的C++;在二进制文件中键入字符串形式的名称?我能把它处理掉吗? 当我将C++类型添加为Objul-C IVAR时,我得到了包含的类型的全名,作为字符串: @interface Test { std::vector<int> _vector; std::unordered_map<int, std::vector<std::string>> _map; } @end @implementation Test @end @接口测试{ std::vector\u vector; std::无序的_图_图; } @结束 @实施测试 @结束,ios,objective-c,objective-c++,Ios,Objective C,Objective C++,结果: .L__unnamed_2: .asciz "_vector" .L__unnamed_3: .asciz "{vector<int, std::allocator<int> >=\"_M_impl\"{_Vector_impl=\"_M_start\"^i\"_M_finish\"^i\"_M_end_of_storage\"^i}}" __objc_ivar_offset_value_Test._vector:

结果:

.L__unnamed_2:
        .asciz  "_vector"

.L__unnamed_3:
        .asciz  "{vector<int, std::allocator<int> >=\"_M_impl\"{_Vector_impl=\"_M_start\"^i\"_M_finish\"^i\"_M_end_of_storage\"^i}}"

__objc_ivar_offset_value_Test._vector:
        .long   0                       # 0x0

.L__unnamed_4:
        .asciz  "_map"

.L__unnamed_5:
        .asciz  "{unordered_map<int, std::vector<std::__cxx11::basic_string<char>, std::allocator<std::__cxx11::basic_string<char> > >, std::hash<int>, std::equal_to<int>, std::allocator<std::pair<const int, std::vector<std::__cxx11::basic_string<char>, std::allocator<std::__cxx11::basic_string<char> > > > > >=\"_M_h\"{_Hashtable<int, std::pair<const int, std::vector<std::__cxx11::basic_string<char>, std::allocator<std::__cxx11::basic_string<char> > > >, std::allocator<std::pair<const int, std::vector<std::__cxx11::basic_string<char>, std::allocator<std::__cxx11::basic_string<char> > > > >, std::__detail::_Select1st, std::equal_to<int>, std::hash<int>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<false, false, true> >=\"_M_buckets\"^^{_Hash_node_base}\"_M_bucket_count\"Q\"_M_before_begin\"{_Hash_node_base=\"_M_nxt\"^{_Hash_node_base}}\"_M_element_count\"Q\"_M_rehash_policy\"{_Prime_rehash_policy=\"_M_max_load_factor\"f\"_M_next_resize\"Q}\"_M_single_bucket\"^{_Hash_node_base}}}"
.L\u未命名\u 2:
.asciz“_向量”
.L__未命名_3:
.asciz“{vector=\”{mu vector\u impl=“{mu vector\u impl=”{mu mu start'^i'.\mu finish'^i'.\mu end'.\u storage'^i}”
__objc_ivar_offset_value_Test.向量:
.long 0#0x0
.L__未命名_4:
.asciz“\u地图”
.L__未命名_5:
据美国国家统计局发布的一项数据。美国国家统计局发布的一项数据。美国国家统计局发布的一项数据。美国国家统计局发布的一项数据。美国国家统计局发布的一项数据。美国国家统计局发布的一项数据。美国国家统计局发布的一项数据。美国国家统计局发布的一项数据。美国国家统计局发布的一项数据。美国国家统计局发布的一项数据。美国国家统计局。美国国家统计局。美国国家统计局。美国国家统计局。美国国家统计局。美国国家统计局。美国国家统计局。美国地图。美国地图。美国地图。美国国家统计局。美国国家统计局。美国国家统计局。美国国家统计局。美国国家统计局。美国国家统计局。美国国家统计局。美国国家统计局。美国统计局。美国地图。美国地图。美国地图。美国地图。美国地图。美国地图。美国地图。美国地图。美国地图。美国地图。美国地图。美国地图。美国统计局。美国地图。美国地图。美国地图。美国地图。_resize \“Q}\“_M_single_bucket\”^{{u Hash_node_base}}”
-请注意,我使用的是
-Os


后者使用的是
std::unordered_map
,大约为1kb。这样做的目的是什么?我可以去掉它吗?

Objective-C运行时使用的类型编码需要这些信息,这也是动态分派工作的一部分。可以通过询问运行时来检索:

Ivar *ivars = class_copyIvarList([Test class], NULL);
printf("%s\n", ivar_getTypeEncoding(ivars[1]));
free(ivars); ivars = NULL;
<>为了消除它,你需要避免直接在Objc对象中放置C++类型。通过装箱,您可以在某种程度上减少冗长:

class Box {
    std::vector<int> _vector;
    std::unordered_map<int, std::vector<std::string> > *_map;
};

@interface Test: NSObject {
    Box box;
}
@end
类框{
std::vector\u vector;
std::无序_图*_图;
};
@接口测试:NSObject{
盒子;
}
@结束
屈服

{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=“\u vector”{vector=“\uu begin”^i“\uu end”^i”\uu end\u cap”{uuuu compressed\u pair=“\uu值”^i}”{u映射”^{无序映射}
指向方框的指针要小一点:

^{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> > > > > >}}
^{Box={vector=^i^i{{uu compressed\u pair=^i}}}{unordered\u map}
当然,你可以通过让盒子A“代码>空洞*<代码>和按需要进行铸造,或者隐藏在一个简单的C++类型和一个piml后面(我还没有尝试过这个方法来看看它是否有效)。但如果将C++(或其他任何东西)直接放在ObjcIVAR中,它必须存储运行时类型的名称。