Dead Code Stripping

比较main函数内不使用注释部分代码和使用注释部分代码区别:

//不使用注释部分代码
#import <Foundation/Foundation.h>
#import "TestStaticLib.h"
int main() {
//    TestStaticLib *lib = [TestStaticLib new];
//    NSLog(@"test---%@",lib);
    return 0;
}

复制代码

使用objdump --macho -d 查看__TEXT段

图片.png

//使用注释部分代码
#import <Foundation/Foundation.h>
#import "TestStaticLib.h"
int main() {
    TestStaticLib *lib = [TestStaticLib new];
    NSLog(@"test---%@",lib);
    return 0;
}

复制代码

使用objdump --macho -d 查看__TEXT段
图片.png
可以发现多出来截图部分的内容,也就是会把静态库代码合并当前到文件中
所以Dead Code Stripping 默认将不使用的代码会进行剥离

但是Category是动态的,会有问题

1.创建一个静态库,添加一个类及这个类的分类
StaticLibClass文件

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface StaticLibClass : NSObject

@end

NS_ASSUME_NONNULL_END

#import "StaticLibClass.h"

@implementation StaticLibClass

@end

复制代码

分类文件StaticLibClass+Dead

#import "StaticLibClass.h"

NS_ASSUME_NONNULL_BEGIN

@interface StaticLibClass (Dead)
-(void)testStaticLibClass;
@end

NS_ASSUME_NONNULL_END

#import "StaticLibClass+Dead.h"

@implementation StaticLibClass (Dead)
-(void)testStaticLibClass
{
    NSLog(@"====testStaticLibClass");
}
@end
复制代码

2.将project的文件拖到上面

图片.png
3.在StaticLib.h导入头文件

#import <StaticLib/StaticLibClass+Dead.h>
复制代码

4.编译后拿到动态库加到测试工程内

图片.png
运行测试工程

图片.png
出现找不到方法的错误,出现这个问题的原因是dead code strip在链接的过程将分类的代码剥离了,所以解决这个问题需要在链接过程中,告诉链接器如何处理。

5.配置链接器参数

图片.png
6.再次运行

图片.png
链接器参数:

  • noall_load:默认参数,不都加载
  • all_load:都加载
  • ObjC:OC相关的代码不剥离,其它的剥离
  • force_load:后面加静态库路径,告诉链接器哪些静态库不要dead code strip
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享