gpt4 book ai didi

objective-c - 开发人员在 Objective-C 中使用 C 函数是否有技术原因

转载 作者:行者123 更新时间:2023-11-30 18:29:02 24 4
gpt4 key购买 nike

某些开发人员使用 C 风格函数调用(通常用于实用程序类型函数)是否存在技术原因。

它是否可以在非 Objective-C 类型的情况下编译,或者是否有其他优势,例如速度?

最佳答案

在 Objective-C 项目中编写 C 风格代码有一些技术原因:

  1. 正如您所提到的,兼容性:如果相关代码不是特定于 Objective-C 的,则将其分解为 C 函数也允许它在 C 项目(以及 C++ 项目)中使用,只要它是有效的 C++)。对于共享库,这很有用。
  2. 偶尔,速度:编译器可以内省(introspection)一些 C 函数和 inline它们,可以增强代码的优化。另一方面,Objective-C 方法调用不能内联(它们是完全动态的 - 方法可以在运行时覆盖和替换,因此用以下内容替换 Objective-C 方法调用是无效的)编译时的静态调度),因此每次调用都会产生 objc_msgSend 的开销。

    在绝大多数情况下,将 Objective-C 方法转换为 C 函数将不会带来显着的速度提升(所以不要去替换方法调用除非它对代码有意义),但有时,在函数调用可能被内联和向量化的紧密循环中,您可能会看到速度上的好处。

  3. 在某些应用程序中,混淆可能会有所帮助。编译 Objective-C 应用程序时,所有类名和选择器名称都会编译到应用程序二进制文件本身中。您可以通过在二进制文件上运行 /usr/bin/strings 来查看结果 - 所有方法名称都会出现。

    但是,只要您不将调试信息标记保留为打开状态(-g,对于发布版本为关闭),C 函数名称就会从应用程序二进制文件中删除,并且该标记不存在在二进制文件中。

    根据您正在执行的操作以及可能想要防范的内容,这可能会使其他人更难检查您的应用程序二进制文件以查找可利用的内容,并允许对代码进行更复杂的混淆。对于保护序列号验证等内容在某种程度上可能有用,但请记住,除非您的应用程序是 code signed ,任何获得二进制文件的人都可以对其进行修改以执行他们想要的操作。 (这可能会让事情变得更加困难。)

  4. 同样,C 函数不存在于运行时中,这使得动态调用它们(可能以恶意方式)变得更加困难。由于 Objective-C 的动态性,所有类、方法、实例变量等都可以在运行时查找、内省(introspection)和修改。对于大多数应用程序来说,这不是一个问题,但如果您有一个具有插件架构的应用程序,则需要注意这一点 - 取决于您如何将插件或 bundle 加载到进程中,您不拥有的代码可能具有访问权限在运行时到您的整个应用程序。

    根据您正在执行的操作,这可能会暴露您不想暴露的数据。另一方面,C 函数不是以这种方式公开的,调用这些函数需要做更多的工作。当然并非不可能(我的意思是,您正在将远程代码加载到您的应用程序中),但有点困难。这比实际安全性更通过隐匿性实现安全性(而不是在其自己的进程中运行插件,与您的进程分开)。

总而言之,对于绝大多数应用程序来说,除了风格原因之外,编写 C 风格代码没有任何好处。熟悉和代码风格可以大有帮助,但大多数应用程序不会看到编写 C 风格代码有明显的好处。对于那些决心破坏您的应用程序的人来说,“安全”好处比其他任何东西都更令人讨厌,并且任何速度改进都可能与磁盘访问和网络调用等内容相形见绌。

关于objective-c - 开发人员在 Objective-C 中使用 C 函数是否有技术原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42240230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com