前面我們已經(jīng)了解到了多個點.o文件是怎么鏈接的,今天關注一下靜態(tài)庫的結構和鏈接的過程。
先寫個簡單的靜態(tài)庫
// DemoFramework.h
#import <Foundation/Foundation.h>
@interface DemoFramework : NSObject
@end
// DemoFramework.m
#import "DemoFramework.h"
@implementation DemoFramework
- (void)codingLife {
NSLog(@"codingLife");
}
@end
// GoodBoy.h
#import <Foundation/Foundation.h>
@interface GoodBoy : NSObject
- (void)xuanGao;
@end
// GoodBoy.m
#import "GoodBoy.h"
@implementation GoodBoy
- (void)xuanGao {
NSLog(@"落葉方知秋");
}
@end
好了編譯一下生成.a文件来氧,MachOView ,查看一下.a文件
這里可以看到有兩個對應.o文件,
start : !<arch>\n 類似于魔書舒憾,這樣人家就知道這是一個.a文件使用.a文件的結構解析它
-
SymTab Header: 符號表頭部
- size: 符號表的大小
Symbol Tabel: 符號表 ,這里的符號表只暴露了一些類的符號表,細節(jié)的符號表藏在.o文件中
Object header : .o文件頭部信息
.o 文件
MachOView 會crash居灯,記得把修改UI的操作調(diào)用到主線程即可祭务,也可以選擇命令行工具
現(xiàn)在嘗試使用一下這個.a文件
#import "ViewController.h"
#import "GoodBoy.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[GoodBoy new] xuanGao];
}
@end
這里只import "GoodBoy.h" 以及使用GoodBoy Class。 使用Hopper Disassembler查看一下app執(zhí)行文件
這里可以看到
[GoodBoy xuanGao] 符號怪嫌,卻找不到 [DemoFramework codingLife] 符號义锥,所以推測在鏈接時候DemoFramework.o文件并沒有鏈接進入執(zhí)行文件.
修改一下code
#import "ViewController.h"
#import "GoodBoy.h"
#import "DemoFramework.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[GoodBoy new] xuanGao];
}
再次反匯編執(zhí)行文件發(fā)現(xiàn)同樣的結果,可見import 不會對最終結果產(chǎn)生影響
再次修改code岩灭,這次開始使用DemoFramework 對象
#import "ViewController.h"
#import "GoodBoy.h"
#import "DemoFramework.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[GoodBoy new] xuanGao];
NSLog(@"%@",[DemoFramework new]);
}
@end
再觀察一下拌倍,這次可以找到codingLife的符號表
結論: 靜態(tài)庫是一系列.o文件的集合,只有被執(zhí)行文件所使用的.o文件才會最終綁定到執(zhí)行文件上面噪径。這么做有利于減少執(zhí)行文件的大小柱恤。
注: 可以觀察最后執(zhí)行文件的大小得到同樣的結果。