iPhone & iPad - 包括一个类会增加二进制?

Posted

技术标签:

【中文标题】iPhone & iPad - 包括一个类会增加二进制?【英文标题】:iPhone & iPad - including a class will increase binary? 【发布时间】:2010-02-26 15:58:11 【问题描述】:

我有一个在我的项目中经常使用的自定义类。这个类有几个方法,但并不是每个项目都会用到。

我的问题是:在项目中包含此类会使项目因无用代码而膨胀,还是编译器只会包含使用的方法?

我的意思是,如果我的类有 30 个方法,但在给定项目中只使用了 4 个,编译器是否还会包含其他未使用的 26 个或仅包含最终产品中使用的 4 个?

如果它包含所有,有没有办法强制它忽略未使用的方法并将二进制文件修剪到最小?

【问题讨论】:

【参考方案1】:

链接器支持dead-stripping,如果您打开它,未使用的代码不会导致任何膨胀。

来自Apple docs:

静态链接器 (ld) 支持 删除未使用的代码和数据块 从可执行文件。这个流程 (称为死代码剥离)有助于 减小整体尺寸 可执行文件,这反过来又改进了 通过减少内存来提高性能 可执行文件的足迹。它也是 允许程序成功链接 当未使用的代码指的是 未定义的符号(而不是结果 在链接错误中)。

死码剥离不限于 仅删除未使用的功能和 来自二进制文件的可执行代码。这 链接器还会删除任何未使用的符号 以及驻留在数据块中的数据。 此类符号可能包括全局 变量、静态变量和 字符串数据等。

启用死代码剥离后, 静态链接器搜索代码 从一开始就无法到达 一组实时符号和块。

【讨论】:

老实说,我不确定这对于 Objective-C 是否正确。由于它是一种动态语言,因此可以通过名称调用方法。所以链接器不知道要剥离什么,要保留什么。 我相当肯定 St3fan 和 KennyTM 是正确的。死代码剥离仅对 C 和 C++ 有用。另见seriot.ch/blog.php?article=20080728。【参考方案2】:

如果其他 26 个方法在 @implementation 中有代码,那么是的,它们将在最终产品中使用。

原因是因为运行时系统。即使你没有在编译时使用这 26 个方法,也不能保证它们不会在运行时被引用(记住 NSSelectorFromString-performSelector:)。

我不知道是否有办法强制删除这些代码。 (-dead_strip 不起作用。)

【讨论】:

我原来也是这么想的。 jessecurry 让我不确定。 @jesse:不不不,反之亦然。那些 ObjC 代码永远不会被删除,即使您添加 __attribute__((unused))(被忽略)。【参考方案3】:

听起来您需要重构并重命名 big fat mamma 类。

【讨论】:

感谢一个真正有意义的答案。在 Objective-C 中没有理由需要一个 big-fat-mamma 类。当需要使用 big-fat-mamma 类时,库太容易精简并包含在 .pch 文件中。【参考方案4】:

我的问题是:包括这个类 在一个项目上会使项目膨胀 使用无用的代码或编译器会 只包括使用的方法?

我认为您正在谈论包含帮助程序类的标头和实现。这将增加二进制大小。正如 jessecurry 所指出的,链接器支持死端剥离。这很糟糕,因为总有可能有人想与您的二进制文件的公共 api 链接(幸运的是,情况并非如此,因为 iphone 上不允许动态链接,但请考虑其他平台)。但我敢打赌,大小上的差异太微不足道了。

在大小方面影响最大的通常是应用程序中包含的资源(图像、字符串等)。

【讨论】:

以上是关于iPhone & iPad - 包括一个类会增加二进制?的主要内容,如果未能解决你的问题,请参考以下文章

iphone 应用程序错误地包括 ipad 笔尖

更改 iPhone 和 iPad 上的备用图标 (setAlternateIcon for iPhone & iPad)

适用于 iPhone 和 iPad 的 iOS 分辨率

iPhone & iPad - 可以在 Xcode 上更改产品名称吗?

iPhone & iPad:通用应用程序,我的用户需要哪个操作系统版本?

新的 iPad 布局,但保持 iPhone 大小类布局相同