首页
学习
活动
专区
工具
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-C、C++ 和 C。...在本文中,我决定更进一步,并计算使用 Objective-C、C++ 和 C 的二进制文件的数量。 请记住,您可以混合不同的编程语言来创建二进制文件。...一个示例是创建一个应用程序,该应用程序使用 C++ 作为低级引擎,使用 Objective-C 作为 UI。....framework/SwiftUI" | wc -l ) 尽管 SwiftUI 并不是真正的编程语言,而是一种用户界面工具包,但我决定将其包含在本文中。...如果您想知道为什么在下面的脚本中没有使用确切的路径,原因是标记libc++abi.dylib为使用 C++。libc++abi是对标准 C++ 库的低级支持,似乎是用 C++ 编写的。

2.1K30

gRPC基础--Protobuf编码格式详解

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

5.4K20
  • Protobuf语言指南

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

    2.2K30

    【Protobuf协议】004-定义服务(Service)、JSPN映射、选项、生成访问类

    当然有些选项可以作用在域、enum类型、enum值、服务类型及服务方法中。到目前为止,并没有一种有效的选项能作用于所有的类型。...如果在.proto文件中没有明确的java_outer_classname定义,生成的class名称将会根据.proto文件的名称采用驼峰式的命名方式进行生成。...这些值将通过如下的方式影响C++及java代码的生成: SPEED (default): protocol buffer编译器将通过在消息类型上执行序列化、语法分析及其他通用的操作。...(文件选项):设置Objective-C类的前缀,添加到所有Objective-C从此.proto文件产生的类和枚举类型。...作为一个方便的拓展,如果DST_DIR以.zip或者.jar结尾,编译器会将输出写到一个ZIP格式文件或者符合JAR标准的.jar文件中。

    10510

    搞定Protocol Buffers (上)- 使用篇

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

    4.9K30

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

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

    6.9K30

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

    1.7K30

    深入理解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 中。

    1.6K12

    【面试必备】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 语言字符串方面的约定。也就是说,单个字符被单引号包括, 字符串被双引号包括。...一个分类可以将方法的实现分解进一系列分离的文件。程序员可以将一组相关的方法放进一个分类, 使程序更具可读性。

    95740

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

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

    6.4K90

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

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

    38820

    转载:【AI系统】传统编译器发展

    例如,在屏幕上输出一句话,Python 语言的写法为:代码语言:txt复制def print_id(comment): print(comment)print_id("我是 ZOMI")二进制的写法就变得非常复杂...编译器可以将整个程序转换为目标代码(object code),这些目标代码通常存储在文件中。目标代码也被称为二进制代码,在进行链接后可以被机器直接执行。...编译的过程,类似于将中文翻译成英文、将英文翻译成象形文字。它是一个复杂的软件执行过程,大致包括词法分析、语法分析、语义分析、性能优化、生成可执行文件等多个步骤,期间涉及到复杂的算法和硬件架构。...GCC 作为 GNU 工程的其中一个课程,原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C 语言。GCC 很快地扩展,变得可处理 C++。...ClangClang 是一个 C、 C++、 Objective-C 和 Objective-C++ 编程语言的编译器前端。它采用了底层虚拟机(LLVM)作为其后端。

    10400

    【AI系统】传统编译器发展

    例如,在屏幕上输出一句话,Python 语言的写法为:def print_id(comment): print(comment)print_id("我是 ZOMI")二进制的写法就变得非常复杂,看到都想撞墙...编译器可以将整个程序转换为目标代码(object code),这些目标代码通常存储在文件中。目标代码也被称为二进制代码,在进行链接后可以被机器直接执行。...编译的过程,类似于将中文翻译成英文、将英文翻译成象形文字。它是一个复杂的软件执行过程,大致包括词法分析、语法分析、语义分析、性能优化、生成可执行文件等多个步骤,期间涉及到复杂的算法和硬件架构。...GCC 作为 GNU 工程的其中一个课程,原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C 语言。GCC 很快地扩展,变得可处理 C++。...ClangClang 是一个 C、 C++、 Objective-C 和 Objective-C++ 编程语言的编译器前端。它采用了底层虚拟机(LLVM)作为其后端。

    11610

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

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

    2.2K31

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

    ,然后使用不同平台下的官方工具来开发 编译流:将某个语言编译为二进制文件,生成动态库或打包成 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

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

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

    73410
    领券