首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Objective-C将完整的C++类型名称作为字符串包含在二进制文件中?我能摆脱它吗?

Objective-C将完整的C++类型名称作为字符串包含在二进制文件中的原因是为了支持Objective-C与C++的混合编程。Objective-C是一种基于C语言的面向对象编程语言,而C++是一种更加强大的面向对象编程语言。在Objective-C中,可以直接调用C++的代码,因此需要知道C++类型的信息。

将完整的C++类型名称作为字符串包含在二进制文件中,可以在运行时动态地解析和使用这些类型。这样做的好处是可以在Objective-C代码中使用C++的类、函数和变量,实现更加灵活和强大的功能。

如果你不需要在Objective-C中使用C++的功能,是可以摆脱这种做法的。可以通过以下几种方式来避免将C++类型名称包含在二进制文件中:

  1. 将C++代码编译为静态库或动态库:将C++代码编译为独立的库文件,然后在Objective-C代码中引用该库文件。这样可以避免将C++类型名称直接包含在二进制文件中。
  2. 使用Objective-C++:将Objective-C文件的扩展名改为.mm,这样可以将Objective-C代码与C++代码混合编译。在Objective-C++中,可以直接使用C++的类、函数和变量,而无需将类型名称包含在二进制文件中。
  3. 将C++代码封装为Objective-C接口:将C++代码封装为Objective-C的类或接口,然后在Objective-C代码中使用这些接口。这样可以隐藏C++类型的具体实现,只需要在Objective-C代码中引用Objective-C接口即可。

总结起来,如果你不需要在Objective-C中使用C++的功能,可以通过编译为库文件、使用Objective-C++或封装为Objective-C接口等方式来避免将C++类型名称包含在二进制文件中。这样可以减小二进制文件的大小,并且提高代码的安全性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

从 iPhone OS 1.0 到 iOS 14 编程语言演变

在这篇新文章通过测量 iOS 中二进制文件总数来回答这个问题。更进一步,并计算使用其他编程语言二进制文件数量:Objective-CC++ 和 C。...在本文中,决定更进一步,并计算使用 Objective-CC++ 和 C 二进制文件数量。 请记住,您可以混合不同编程语言来创建二进制文件。...一个示例是创建一个应用程序,该应用程序使用 C++ 作为低级引擎,使用 Objective-C 作为 UI。....framework/SwiftUI" | wc -l ) 尽管 SwiftUI 并不是真正编程语言,而是一种用户界面工具,但我决定将其包含在本文中。...如果您想知道为什么在下面的脚本没有使用确切路径,原因是标记libc++abi.dylib为使用 C++。libc++abi是对标准 C++低级支持,似乎是用 C++ 编写

2K30

Protobuf语言指南

类似的,新代码创建消息也由旧版代码解析:旧版消息(二进制)在解析时简单地忽略了新增字段,查看下面的未知字段章节了解更多。 只要在更新后消息类型不再重用字段编号,就可以删除该字段。...如果未给映射字段指定值,字段被序列化时行为依语言而定。在C++, Java和Python字段类型默认值会被序列化作为字段值,而其他语言则不会。...给Message加名 你可以在 .proto文件添加一个可选 package符来防止消息类型之前名称冲突。...如果尚未安装编译器,请下载该软件并按照README文件说明进行操作。...必须提供一个或多个.proto文件作为输入。可以一次指定多个.proto文件。虽然文件是相对于当前目录命名,但每个文件必须存在于其中一个IMPORT_PATH,以便编译器可以确定其规范名称

2.2K30
  • gRPC基础--Protobuf编码格式详解

    类似的,新代码创建消息也由旧版代码解析:旧版消息(二进制)在解析时简单地忽略了新增字段,查看下面的未知字段章节了解更多。 只要在更新后消息类型不再重用字段编号,就可以删除该字段。...如果未给映射字段指定值,字段被序列化时行为依语言而定。在C++, Java和Python字段类型默认值会被序列化作为字段值,而其他语言则不会。...给Message加名 你可以在 .proto文件添加一个可选 package符来防止消息类型之前名称冲突。...如果尚未安装编译器,请下载该软件并按照README文件说明进行操作。...必须提供一个或多个.proto文件作为输入。可以一次指定多个.proto文件。虽然文件是相对于当前目录命名,但每个文件必须存在于其中一个IMPORT_PATH,以便编译器可以确定其规范名称

    5.2K20

    搞定Protocol Buffers (上)- 使用篇

    Int类型字段始终保留其值。 改变单值类型数据为新oneof数据一个成员是安全并且二进制兼容。如果你保证多个字段同时最多只存在一个时,这些字段放进一个新oneof类型也可能是安全。...在3.5版本和更高版本,未知字段将在解析期间保留并包含在序列化输出。 Any Any消息类型可以让你消息用做内嵌类型,而不需要知道他们.proto定义。...比如,Open将会在命名空间Foo.Bar 名称解析 protocol buffer语言中类型名称解析类似C++:首先搜索最内层范围,然后是下一个最里面的,以此类推,每个都被认为是其父“...protocol buffer编译器通过导入.proto文件来解析所有类型名称。每种语言代码生成器都知道如何引用该语言中每种类型,即使具有不同范围规则。...但是,到目前为止,没有一种有效选项作用于任意类型。 以下是一些最常用选项: java_package(文件选项):为你生成代码设置路径。

    4.7K30

    【面试必备】Swift 面试题及其答案

    ---- 答案:optional 类型被用来表示任何类型变量都可以表示缺少值。在 Objective-C ,引用类型变量是可以缺少值,并且使用 nil 作为缺少值。...允许字符串和整数相比较,像这样: 应用程序不会崩溃,但是允许字符串和整数相比较可能不是预想结果。 通过采用泛型,可以合并这两个函数为一个并同时保持类型安全。...很难说 Swift 是一个成熟函数式语言,但是已经具备了函数式语言基础。 问题2- 下面的功能特性都包含在 Swift ?...3 是通过 typealias 部分实现。 typealias 不是一个泛型类型,只是一个占位符名字。 通常是作为关联类型被引用,只有协议被一个类型引用时候才被定义。...---- 你通过 extension (扩展)保存一个属性?请解释一下原因。 答案:不能。扩展可以给当前类型添加新行为,但是不能改变本身类型或者本身接口。

    6.3K30

    Flutter Platform Channels(一)

    Flutter框架及其底层图形引擎足够能力独立完成他们工作。 如果除了绘制像素之外你所做一切都是文件或网络I/O和相关业务逻辑,那这也不是问题。Dart语言运行时和库可以满足你需求。...应用程序Flutter部分包含在标准平台特定组件,例如Android上View以及iOS上UIViewController。...本文是对平台渠道深入介绍。 从Flutter消息传递基础开始,介绍消息/方法/事件( message/method/event )通道概念,并讨论一些API设计注意事项。...iOS上类似; 并不擅长Swift,欢迎提出改进意见: // 在os上接收来自Dart二进制消息. // 此代码可以添加到FlutterAppDelegate 子类 // 通常是在application...一种方法是让消息表示一个方法调用,并将它作为参数。 因此,你需要一种方法名称与消息参数分开标准方法。 而且你还需要一种标准方法来区分成功回复和错误回复。

    4.4K01

    Swift是花拳绣腿?——谈谈开发语言与程序员职业发展

    例如Double类型变量,默认值是0。这点与Objective-CC++和C语言不同,不对变量赋值的话,那么变量默认值是一个随机数。如果不注意这点,则很容易由此导致Bug产生。...在下面的代码,repeat函数可以接受一个闭类型task参数。在调用repeat函数时,传入第二个参数是一个函数体,其中包含了一行打印语句。 那么什么是闭呢?...闭有以下3个特点: 匿名函数(方法); 可以被执行; 可以被作为参数传递。 提到闭,想必很多人都会想到JavaScript。我们就来对比一下JavaScript。...在Swift中使用泛型很方便,语法和Java、C#、C++也很类似。 不过使用Objective-C朋友也有福了,在即将发布XCode7Objective-C也支持泛型了。...JavaScript作为一个前台语言为什么这么流行?一个重要因素是诸如像Google Chrome和FireFox等工具为JavaScript提供了相当完善、相当优秀调试工具。

    1.6K30

    深入理解Kotlin Native梦想与可能

    1.2 Kotlin Native 简介 Kotlin Native 是指 Kotlin 源代码编译为目标平台本地二进制可执行程序或库,以类似于 C/C++、Go 等语言方式运行在目标平台原生环境...符号冲突 在前面的分析,我们看到了 C++ 命名空间和 Kotlin 名对符号名字修饰影响。...C 语言标准没有规定字符串采用什么编码,字符串字面量编码取决于代码文件字符编码,字符串编码则取决于来源。...如果读者熟悉 C/C++ 宽字符 wchar_t 类型,我们可以 Kotlin 字符串转换成 C 语言字符串过程类比成宽字符串(wchar_t *)转换成窄字符串(char *)过程(调用 C...创建数组过程。 可以看到,这里实际上发生了两次复制,第一次是 1,2,3 复制到 memScope 创建临时内存,第二次则是临时内存完整地复制到 Kotlin ByteArray

    1K11

    【面试必备】Swift 面试题及其答案

    Objective-C,引用类型变量是可以缺少值得,并且使用nil作为缺少值。基本数据类型如int 或者float没有这种功能。...允许字符串和整数相比较,像这样: areTheyEqual(1, "ray") 应用程序不会崩溃,但是允许字符串和整数相比较可能不是预想结果。...很难说Swift是一个成熟函数式语言,但是已经具备了函数式语言基础。 问题2- Swift 1.0 or later 下面的功能特性都包含在Swift?...3是通过typealias部分实现。typealias不是一个泛型类型,只是一个占位符名字。通常是作为关联类型被引用,只有协议被一个类型引用时候才被定义。...问题2- Swift 1.0 or later 闭是引用类型? 答案:闭是引用类型

    2.8K20

    Objective-C笔记

    扩展了标准ANSI C编程语言, Smalltalk式消息传递机制加入到ANSI C。当前主要支持编译器有GCC和Clang(采用LLVM作为后端)。...头文件包含类,类型,函数和常数声明。 .m 源代码文件。这是典型源代码文件扩展名,可以包含 Objective-C 和 C 代码。 .mm 源代码文件。...带有这种扩展名源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你Objective-C代码确实需要使用C++类或者特性时候才用这种扩展名。...这也是为什么OC方法调用称之为消息传递原因。 字符串 作为C语言超集,Objective-C 支持 C 语言字符串方面的约定。也就是说,单个字符被单引号包括, 字符串被双引号包括。...一个分类可以方法实现分解进一系列分离文件。程序员可以一组相关方法放进一个分类, 使程序更具可读性。

    94040

    Sketch 插件开发官方文档合集插件基础您第一个插件开发环境调试ActionAPI发布插件插件捆绑插件,脚本和命令插件位置更多关于CocoaScriptSketchTool参考资源

    作为一个经验法则,通常会manifest.json在所有其他信息放入时将相关命令信息放入package.json(skpm将在编译时这些信息添加到manifest.json,以便您不必复制它们...2.手动 manifest.json包含在插件文件中有一个额外条目,您需要定义更新才能正常工作。 该条目被调用appcast,它是一个指定appcast文件URL字符串。...title 指定用于子菜单标题字符串。 items 这是一个列出要包含在菜单项目的数组。...它可以包含两种类型项目: 一个给出命令标识符字符串 描述子菜单字典(包含“标题”和“项目”) isRoot 默认情况下,此字典列出菜单项显示在菜单,其名称由标题键指定。...这些命令每一个实际上都是作为一个JavaScript函数实现(我们称之为处理程序),位于该脚本文件

    6.3K90

    【IOS开发高级系列】Lua与OC交互专题

    不再需要操心内存分配之类事务。Wax为你处理这一切。         Lua类型自动转换成对应Objective-C类型,反之亦然。...从这里下载压缩。         现在,解压缩刚下载文件。浏览到刚解压缩文件夹。它会有“probablycorey-wax-124ca46”之类名称。         ...遗憾是,对于XcodeLua语法高亮问题,还没有发现稳定解决方案(是你发现了,请留言告诉!)。         ...Lua函数名称不能有冒号。为了补偿这个差异,凡是Objective-C中隔开方法名称地方,在Lua中都换成下划线。...为了克服这个问题,Wax自动每个方法第一个变量作为类的当前实例。

    35620

    从预编译角度理解Swift与Objective-C及混编机制

    可能又有人会好奇,为什么从来没看到过 @import 写法呢?...Clang 会将相应编译参数进行一次 Hash,获得 Hash 值作为 Module 缓存文件名称,这里需要注意是,不同参数和值会导致文件夹不同,所以想要尽可能利用 Module 缓存,...很简单,Swift 编译器 Clang 大部分功能包含在其自身代码,这就使得我们能够以 Module 形式,直接引用 Objective-C 代码。 ?...是不会包含在这个文件。...,当然还会包含一个二进制文件(PodB),但在实际编译 PodA 组件过程,我们并不需要 B 组件里二进制文件,而这让拉取完整 Framework 文件显得多余了。

    2.2K31

    从bug看11种编程语言演化史,果然如今Python最流行

    提问最多框架、程序、函数和方法是什么呢?哪些数据类型给开发者带来最多困扰呢?这些问题在不同编程语言中又有哪些不同呢? 为了得出结果,作者做了以下工作: 1....然而,Python 有着广泛用途,类似于一种「胶水语言」,在技术很多不同领域都有应用,这也可以解释为什么网络开发「django」(中下)会是一个重要关键词。 R 语言 ?...现在依然发挥着这样作用,这也是为什么这个编程语言中常常提出问题都和「laravel」框架相关。 SQL ? SQL 并不是有着完整特性编程语言。只为一个任务而生:操作数据。...每个编程语言都在不断地朝着,甚至被设计,来完成科技某个部分。R 用于数据科学,而 Swift 则用于 IOS 开发,C++则是电子游戏开发。这解释了为什么不同编程语言会爆出不同 bug。...基本数据类型——如字符串和数组(但不是整型、浮点型或布尔型)数据是经常给开发者带来痛点地方。 最终,所有的问题集合在一起做成词云。 ?

    72910

    聊聊移动端跨平台开发各种技术

    ,然后使用不同平台下官方工具来开发 编译流:某个语言编译为二进制文件,生成动态库或打包成 apk/ipa/xap 文件 虚拟机流:通过某个语言虚拟机移植到不同平台上来运行 Web 流 Web 流是大家都比较了解了...作为这几年争论热点,网上已经有很多关于讨论了,这里重点聊聊大家最关心性能问题。 Web 流最常被吐槽就是性能慢(这里指内嵌 HTML 性能,不考虑网络加载时间),可为什么慢呢?...编译流 编译流比前面的代码转换更进一步,直接某个语言编译为普通平台下二进制文件,这种做法有明显优缺点: 优点 可以重用一些实现很复杂代码,比如之前用 C++ 实现游戏引擎,重写一遍成本太高...RoboVM RoboVM 可以 Java 字节码编译为可在 iOS 下运行机器码,这有点类似 GCJ,但它具体实现是先使用 Soot 字节码编译为 LLVM IR,然后通过 LLVM 编译器编译成不同平台下二进制文件...这么做最大好处就是完整支持所有系统 API,对于第三方库也很好支持,但它目前最大缺点是生成文件体积过大,即便什么都不做,生成 apk 文件也有 8.4 MB,因为它将所有 API binding

    1.6K21

    聊聊移动端跨平台开发各种技术

    ,然后使用不同平台下官方工具来开发 编译流:某个语言编译为二进制文件,生成动态库或打包成 apk/ipa/xap 文件 虚拟机流:通过某个语言虚拟机移植到不同平台上来运行 Web 流 Web 流是大家都比较了解了...作为这几年争论热点,网上已经有很多关于讨论了,这里重点聊聊大家最关心性能问题。 Web 流最常被吐槽就是性能慢(这里指内嵌 HTML 性能,不考虑网络加载时间),可为什么慢呢?...编译流 编译流比前面的代码转换更进一步,直接某个语言编译为普通平台下二进制文件,这种做法有明显优缺点: 优点 可以重用一些实现很复杂代码,比如之前用 C++ 实现游戏引擎,重写一遍成本太高...RoboVM RoboVM 可以 Java 字节码编译为可在 iOS 下运行机器码,这有点类似 GCJ,但它具体实现是先使用 Soot 字节码编译为 LLVM IR,然后通过 LLVM 编译器编译成不同平台下二进制文件...这么做最大好处就是完整支持所有系统 API,对于第三方库也很好支持,但它目前最大缺点是生成文件体积过大,即便什么都不做,生成 apk 文件也有 8.4 MB,因为它将所有 API binding

    2.2K50

    iOS蓝牙开发如何更好地收发数据

    如果在Objective-C,会长这样子(不是官方框架,用是BabyBluetooth框架): // BabyBluetooth这个框架框架监听和回调写在一起(用Block实现),能让代码不至于那么分散...好了,经过上面的一系列稍显繁琐步骤,我们从蓝牙那边拿到了「NSData?」类型Objective-C对应是「NSData」类型数据。 我们打印一个「NSData?」...我们暂且这样理解:NSData(NSMutableData)是二进制数据对象——苹果二进制数据封装成对象,让我们可以用面向对象思维去操作这些数据。...为什么不直接用二进制?...你要继续坚持用二进制?「阿尔法狗」倒应该是很乐意。 正因为二进制与十六进制之间转换比较简单,所以在计算机领域,16进制比较通用。

    2.8K32
    领券