我有一个经常在我的项目中使用的自定义类。这个类有几个方法,但并不是每个项目都使用它们。
我的问题是:在项目中包含这个类会用无用的代码使项目膨胀,还是编译器只会包含使用的方法?
我的意思是,如果我的类有 30 个方法,但在给定项目中只使用了 4 个方法,编译器是否还会包括其他未使用的 26 个或仅在最终产品中使用的 4 个?
如果它包含所有内容,有没有办法强制它忽略未使用的方法并将二进制文件修剪到最低限度?
我有一个经常在我的项目中使用的自定义类。这个类有几个方法,但并不是每个项目都使用它们。
我的问题是:在项目中包含这个类会用无用的代码使项目膨胀,还是编译器只会包含使用的方法?
我的意思是,如果我的类有 30 个方法,但在给定项目中只使用了 4 个方法,编译器是否还会包括其他未使用的 26 个或仅在最终产品中使用的 4 个?
如果它包含所有内容,有没有办法强制它忽略未使用的方法并将二进制文件修剪到最低限度?
如果其他 26 种方法有代码@implementation
,那么是的,它们将用于最终产品。
原因是因为运行时系统。即使您没有在编译时使用这 26 个方法,也不能保证它们不会在运行时被引用(记住NSSelectorFromString
和-performSelector:
)。
我不知道是否有办法强制删除这些代码。(-dead_strip
不起作用。)
链接器支持dead-stripping,如果你打开它,未使用的代码应该不会导致任何膨胀。
来自苹果文档:
静态链接器 (ld) 支持从可执行文件中删除未使用的代码和数据块。此过程(称为死代码剥离)有助于减少可执行文件的整体大小,进而通过减少可执行文件的内存占用来提高性能。它还允许程序在未使用的代码引用未定义的符号时成功链接(而不是导致链接错误)。
死代码剥离不仅限于从二进制文件中删除未使用的函数和可执行代码。链接器还会删除驻留在数据块中的任何未使用的符号和数据。此类符号可能包括全局变量、静态变量和字符串数据等。
启用死代码剥离后,静态链接器会搜索从一组初始活动符号和块中无法访问的代码。
听起来您需要重构并重命名 big fat mamma 类。
我的问题是:在项目中包含这个类会用无用的代码使项目膨胀,还是编译器只会包含使用的方法?
我认为您正在谈论包括帮助程序类的标头和实现。这将增加二进制大小。正如 jessecurry 所指出的,链接器支持死端剥离。这很糟糕,因为总有可能有人想与您的二进制文件的公共 api 链接(幸运的是,情况并非如此,因为 iphone 上不允许动态链接,但请考虑其他平台)。但我敢打赌,大小的差异太微不足道了。
对大小影响最大的通常是应用程序中包含的资源(图像、字符串等)。