比较main函数内不使用注释部分代码和使用注释部分代码区别:
//不使用注释部分代码
#import <Foundation/Foundation.h>
#import "TestStaticLib.h"
int main() {
// TestStaticLib *lib = [TestStaticLib new];
// NSLog(@"test---%@",lib);
return 0;
}
复制代码
使用objdump --macho -d
查看__TEXT段
//使用注释部分代码
#import <Foundation/Foundation.h>
#import "TestStaticLib.h"
int main() {
TestStaticLib *lib = [TestStaticLib new];
NSLog(@"test---%@",lib);
return 0;
}
复制代码
使用objdump --macho -d
查看__TEXT段
可以发现多出来截图部分的内容,也就是会把静态库代码合并当前到文件中
所以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
的文件拖到上面
3.在StaticLib.h
导入头文件
#import <StaticLib/StaticLibClass+Dead.h>
复制代码
4.编译后拿到动态库加到测试工程内
运行测试工程
出现找不到方法的错误,出现这个问题的原因是dead code strip在链接的过程将分类的代码剥离了,所以解决这个问题需要在链接过程中,告诉链接器如何处理。
5.配置链接器参数
6.再次运行
链接器参数:
- noall_load:默认参数,不都加载
- all_load:都加载
- ObjC:OC相关的代码不剥离,其它的剥离
- force_load:后面加静态库路径,告诉链接器哪些静态库不要dead code strip
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END