Dead Code Stripping

比較main函數內不使用註釋部分代碼和使用註釋部分代碼區別:c++

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

複製代碼

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

圖片.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文件ui

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface StaticLibClass : NSObject

@end

NS_ASSUME_NONNULL_END

#import "StaticLibClass.h"

@implementation StaticLibClass

@end

複製代碼

分類文件StaticLibClass+Deadspa

#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的文件拖到上面code

圖片.png 3.在StaticLib.h導入頭文件orm

#import <StaticLib/StaticLibClass+Dead.h>
複製代碼

4.編譯後拿到動態庫加到測試工程內圖片

圖片.png 運行測試工程ip

圖片.png 出現找不到方法的錯誤,出現這個問題的緣由是dead code strip在連接的過程將分類的代碼剝離了,因此解決這個問題須要在連接過程當中,告訴連接器如何處理。

5.配置連接器參數

圖片.png 6.再次運行

圖片.png 連接器參數:

  • noall_load:默認參數,不都加載
  • all_load:都加載
  • ObjC:OC相關的代碼不剝離,其它的剝離
  • force_load:後面加靜態庫路徑,告訴連接器哪些靜態庫不要dead code strip
相關文章
相關標籤/搜索