devs在Objective-C中使用C函数是否存在技术原因?

时间:2017-02-15 03:34:00

标签: objective-c c

是否有技术原因导致某些开发人员使用C样式函数调用,通常用于实用程序类型函数。

是否可以在非目标c类型的情况下进行编译,还是还有一些其他优势,如速度?

1 个答案:

答案 0 :(得分:4)

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

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

    在绝大多数情况下,将Objective-C方法转换为C函数将 net显着提高速度(因此不要更换方法调用使用C函数,除非它对代码有意义),但偶尔,在函数调用可能内联和向量化的紧密循环中,您可能会看到速度优势。

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

    但是,只要不将调试信息标志保留在(-g上,关闭发布版本),就会从应用程序二进制文件中删除C函数名称,并且二进制文件中不存在此函数名称。

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

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

    。在整个应用程序中运行。

    根据您的操作,这可能会暴露您不希望暴露的数据。另一方面,C函数不会以这种方式暴露,调用它们需要更多的工作。当然不是不可能(我的意思是,你将远程代码加载到你的应用程序中),但有点困难。与实际安全性相比,这更加安全性(相反,在自己的流程中运行插件,与您的插件分开)。

  5. 总之,对于绝大多数应用程序而言,编写C风格代码除了风格原因外没有任何好处。熟悉和代码风格可以有很长的路要走,但大多数应用程序都不会看到编写C风格代码的明显好处。对于决定破坏你的应用程序的人来说,“安全”的好处更令人讨厌,而且任何速度改进都可能因磁盘访问和网络呼叫等问题而相形见绌。