亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS創建與使用靜態庫

2020-07-26 03:23:50
字體:
來源:轉載
供稿:網友

  在日常項目開發中,不論是為了兩個公司項目上的業務交流還是為了減少項目的編譯時間,有的時候我們會把項目中的私密內容打包成靜態庫,或者是把項目中變動較少一部分打包成靜態庫以便提高編譯效率,那么下面我們就來學習一下"iOS-靜態庫的創建與使用":

(一)iOS靜態庫、動態庫與Framework靜態庫與動態庫的區別

(1)什么是庫?

庫(Library)直白一點說就是一段編譯好的二進制代碼,加上頭文件就可以供別人使用;(例如: iOS中Objective-C編譯下的.h和.m文件,打包靜態庫后會變為.h和.a文件);

(2)什么是靜態庫?

①靜態庫即靜態鏈接庫(例如: windows下的.lib、Mac和Linux下的.a);

②靜態庫在編譯的時候會被直接拷貝一份,復制到目標程序里并且這段代碼在目標程序里就不會在改變了,我猜這也是該庫叫"靜態庫"的原因;

③靜態庫的利弊:

1)利: 靜態庫在編譯完成之后,庫文件實際上就沒有作用了,目標程序沒有外部依賴,直接就可以運行;

2)弊: 弊端靜態庫會使用目標程序的體積增大;

(3)什么是動態庫?

①動態庫即動態鏈接庫(例如: windows下的.dll、Mac下的.dylib、Linux下的.so);

②與靜態庫相反,動態庫在編譯時并不會被拷貝到目標程序中,目標程序中只會存儲指向動態庫的引用,等到程序運行時,動態庫才會被真正加載進來;

③動態庫的利弊:

1)利:不需要拷貝到目標程序中,不會影響目標程序的體積,而且同一份庫可以被多個程序使用(因為這個原因,動態庫也被稱作共享庫);同時,編譯時才載入的特性,也可以讓我們隨時對庫進行替換,而不需要重新編譯代碼;

2)弊:動態載入會帶來一部分性能損失,使用動態庫也會使得程序依賴于外部環境;如果環境缺少動態庫或者庫的版本不正確,就會導致程序無法運行;

(4)什么時候我們會用到庫呢?

①某些代碼片段需要給別人使用,但是我們不希望別人看到源碼,就需要以庫的形式進行封裝,只暴露出頭文件;

②對于某些不會進行大的改動的代碼,我們想減少編譯的時間,就可以把它打包成庫,因為庫是已經編譯好的二進制了,編譯的時候只需要 Link 一下,不會浪費編譯時間;

說明:上面提到庫在使用的時候需要Link,Link 的方式有兩種:靜態和動態,于是便產生了靜態庫和動態庫("攻城獅"的思維就是這么簡單);

(5)iOS Framework?

①除了上面我們提到iOS的.a和.dylib之外,Mac OS/iOS 平臺還可以使用 Framework,Framework實際上是一種打包方式,將庫的二進制文件、頭文件和有關的資源文件打包到一起,方便管理和分發;在 iOS 8 之前,iOS 平臺不支持使用動態 Framework,開發者可以使用的 Framework 只有蘋果自家的 UIKit.Framework,Foundation.Framework 等等;

②上面這種限制可能是出于安全的考慮,換一個角度講,因為 iOS 應用都是運行在沙盒當中,不同的程序之間不能共享代碼,同時動態下載代碼又是被蘋果明令禁止的,沒辦法發揮出動態庫的優勢,實際上動態庫也就沒有存在的必要了;

③由于上面提到的限制,開發者想要在 iOS 平臺共享代碼,唯一的選擇就是打包成靜態庫 .a 文件,同時附上頭文件;但是這樣的打包方式不夠方便,使用時也比較麻煩,大家還是希望共享代碼都能能像 Framework 一樣,直接扔到工程里就可以用;

④終于在日思夜盼便迎來了iOS對動態庫的支持:iOS 8/Xcode 6 推出之后,iOS 平臺添加了動態庫的支持,同時 Xcode 6 也原生自帶了 Framework 支持(動態和靜態都可以);

⑤但是說道這里博主要告訴一下大家,iOS動態庫且用且珍惜(小心應用審核被拒😄😄);

(二)切入主題"iOS靜態庫的創建":

(1)我們先了解靜態庫文件的版本(四種):

①真機-Debug版本; ?、谡鏅C-Release版本 ?、勰M器-Debug版本  ④模擬器-Release版本;

(2)Debug(調試)版本特點:

①含完整的符號信息,以方便調試; ?、诓粫Υa進行優化;

(3)Release(發布)版本特點:

①不會包含完整的符號信息; ?、趫绦写a是進行過優化的;  ③大小會比Debug版本的略小 ?、茉趫绦兴俣确矫?Release版本會快一些;

所以我們一般開發中都打包Release(發布)版本使用;

(4)再來了解一下iPhone設備CPU的架構簡介:

①模擬器:(4s~5: i386)    (5s~6splus: x86_64)

②真 機: (3gs~4s: armv7)  (5~5c: armv7s)     (5s~6splus: arm64)[說明: 靜態庫只要支持了armv7,就可以跑在armv7s的架構上];

(三)制作靜態庫-Debug版本:

(1)創建Cocoa Touch Static Library,新建項目選擇iOS ->Framework&Library ->Cocoa Touch Static Library,如圖1:

(2)點擊Next給工程命名如"Library"點擊Next,Xcode自動為我們創建了Library.h/.m文件以及相對應的目錄結構,如圖2所示:

    

(3)接下來我們在工程的.h和.m里面編寫功能實現的代碼(重在靜態庫的創建, 代碼粗略請大家無視😄😄):

"Library.h"/** 十六進制轉二進制 */+ (NSString *)getBinaryByhex:(NSString *)hex;"Library.m"+ (NSString *)getBinaryByhex:(NSString *)hex {  NSMutableDictionary *hexDic = [[NSMutableDictionary alloc] init];    hexDic = [[NSMutableDictionary alloc] initWithCapacity:16];  [hexDic setObject:@"0000" forKey:@"0"];  [hexDic setObject:@"0001" forKey:@"1"];  [hexDic setObject:@"0010" forKey:@"2"];  [hexDic setObject:@"0011" forKey:@"3"];  [hexDic setObject:@"0100" forKey:@"4"];  [hexDic setObject:@"0101" forKey:@"5"];  [hexDic setObject:@"0110" forKey:@"6"];  [hexDic setObject:@"0111" forKey:@"7"];  [hexDic setObject:@"1000" forKey:@"8"];  [hexDic setObject:@"1001" forKey:@"9"];  [hexDic setObject:@"1010" forKey:@"A"];  [hexDic setObject:@"1011" forKey:@"B"];  [hexDic setObject:@"1100" forKey:@"C"];  [hexDic setObject:@"1101" forKey:@"D"];  [hexDic setObject:@"1110" forKey:@"E"];  [hexDic setObject:@"1111" forKey:@"F"];    NSString *binaryString=[[NSMutableString alloc] init];    for (int i=0; i<[hex length]; i++) {    NSRange rage;    rage.length = 1;    rage.location = i;    NSString *key = [hex substringWithRange:rage];    binaryString = [NSString stringWithFormat:@"%@%@",binaryString,[NSString stringWithFormat:@"%@",[hexDic objectForKey:key]]];  }  return binaryString;}

(4)編譯項目生成對應的靜態庫.a文件(在這里注意一下細節):

①在工程編譯(Command+B)之前"標號為②的框框中libLibrary.a"為紅色(編譯之后為黑色, 紅色表示一個虛擬的文件工程中找不到它),如圖3所示:

      

②編譯的過程中我們要選擇"模擬器編譯"和"真機編譯",如圖4圖5所示:

      

(5)右擊工程目錄下.a文件,查看編譯之后的靜態庫文件如圖6所示, 其中文件Debug-iphoneos里面包含iPhone真機所需要的libLibrary.a靜態庫文件,文件Debug-iphonesimulator里面包含的時iPhone模擬器所需要的libLibrary.a靜態庫文件,如圖7所示;

    

(6)分別查看打包好的模擬器與真機的靜態庫所支持的cpu架構:

在上面我們介紹了iPhone設備CPU的架構,在這里我們就來查看我們所打包的靜態庫是否符合iPhone設備包含的架構標準(提示: 如果不符合某些架構的標準,靜態庫運行到不同機型上回報錯誤),打開終端查看靜態庫的架構如圖8所示:

我們找到原因如圖9所示,下面Debug:Yes表示只編譯選中模擬器對應的架構,No則為編譯所有模擬器支持的cup架構(Debug的Yes狀態改為No即可);

    

再一次Command+B 編譯重復上面第(4)步的小步驟,就OK了,😄😄...

(7)合并靜態庫:

①為什么要合并靜態庫呢?

因為真機和模擬器的靜態庫,是不一樣的,不能同時適用在真機和模擬器上,但要滿足這要求的話,要對編譯好的兩個靜態庫進行合并在使用;

②合并靜態庫的利弊?

1)利:開發過程中既可以在真機上調試,也可以在模擬器上調試;

2)弊:如果靜態庫太大,合并打包后,會非常大,因此很多第三方的靜態庫的.a是區分版本的;

③打開終端合并靜態庫(終于快成功了😄😄...)如圖10所示:

      

其中完整的命令是:

復制代碼 代碼如下:
lipo -create /Users/apple/Library/Developer/Xcode/DerivedData/Library-bmlhmlslupltsqfkcfgmgqzducdy/Build/Products/Debug-iphoneos/libLibrary.a /Users/apple/Library/Developer/Xcode/DerivedData/Library-bmlhmlslupltsqfkcfgmgqzducdy/Build/Products/Debug-iphonesimulator/libLibrary.a -output /Users/apple/Desktop/libLibrary.a;

(8)靜態庫的使用:

將合并好的靜態庫文件(.a)和頭文件(.h)添加到工程里面,調用靜態庫,結果如下(代碼粗略請大家無視...):

"ViewController.h"@interface ViewController : UIViewController@end"ViewController.m"#import "ViewController.h"#import "Library.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {  [super viewDidLoad];  // 十六進制轉二進制  NSLog(@"十六進制轉二進制: %@", [Library getBinaryByhex:@"F"]);}

日志打印輸入結果是:
靜態庫的使用[1006:40288] 十六進制轉二進制: 1111

(四)制作靜態庫-Release版本:

跟Debug版步驟一樣,只不過在編譯時,改下面的選項即可如圖12所示:

  

這時不管是真機還是模擬器都可以編譯通過,正常運行;而使用者只能通過頭文件知道我們提供的借口,卻不知道實現文件中實現的細節,這有效地隱藏了自己的核心技術和機密內容;

以上就是我對iOS靜態庫的理解與解釋,希望大家相互補充相互學習。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲免费影视第一页| 最新国产精品拍自在线播放| 亚洲男人天堂古典| 91色在线视频| 另类少妇人与禽zozz0性伦| 91精品国产91久久久久久最新| 欧美在线视频观看免费网站| 国产一区二区日韩精品欧美精品| 亚洲国产成人精品一区二区| 日本成人精品在线| 色老头一区二区三区在线观看| 亚洲国产高潮在线观看| 国产精品久久999| 精品女厕一区二区三区| 国产一区二区三区在线播放免费观看| 欧美在线观看一区二区三区| 国产亚洲a∨片在线观看| 国产精品第8页| 国产免费观看久久黄| 亚洲国产日韩精品在线| 欧美一级大片在线观看| 中文字幕在线精品| 亚洲视频一区二区| 精品久久久久久久久久久久久| 日韩欧美黄色动漫| 日韩av网站导航| 日韩在线国产精品| 久久精品夜夜夜夜夜久久| 日韩国产一区三区| 欧美国产极速在线| 成人午夜在线影院| 欧美成人激情视频免费观看| 精品高清一区二区三区| 91精品视频在线看| 国产v综合ⅴ日韩v欧美大片| 国外成人免费在线播放| 成人精品久久av网站| 成人淫片在线看| 亚洲天堂av高清| 日韩电影大片中文字幕| 亚州国产精品久久久| 亚洲mm色国产网站| 日韩中文字幕国产精品| 国产又爽又黄的激情精品视频| 欧美在线视频在线播放完整版免费观看| 中文精品99久久国产香蕉| 久久久亚洲国产| 日本精品久久中文字幕佐佐木| 国产成人精品综合久久久| 欧美亚洲日本黄色| 国产精品久久二区| 亚洲91av视频| 久久久成人精品视频| 欧美激情网站在线观看| 欧美日韩成人在线观看| 国产成人精品优优av| 中文字幕亚洲一区二区三区五十路| 日韩国产高清污视频在线观看| 51久久精品夜色国产麻豆| 日韩欧美在线观看视频| 国产精品www网站| 国产精品h在线观看| 成人网在线免费观看| 欧美另类高清videos| 中文字幕一精品亚洲无线一区| 日韩在线视频观看正片免费网站| 91免费的视频在线播放| 亚洲天堂av综合网| 91精品视频免费看| 伊人青青综合网站| 久久久久免费精品国产| 亚洲国产精品999| 成人网在线免费观看| 国产精品va在线播放我和闺蜜| 91久久精品久久国产性色也91| 亚洲xxxx妇黄裸体| 欧美性猛交xxxx乱大交3| 久久久久久伊人| 午夜精品一区二区三区在线视| 久久影院资源网| 成人日韩av在线| 日韩毛片在线看| 欧美激情视频给我| 久久亚洲综合国产精品99麻豆精品福利| 中文字幕日韩综合av| 26uuu亚洲伊人春色| 欧美猛交ⅹxxx乱大交视频| 精品国模在线视频| 国产精品jvid在线观看蜜臀| 一本一道久久a久久精品逆3p| 久久久久五月天| 国产精品2018| 国产成人一区二区在线| 亚洲精品小视频在线观看| www.欧美三级电影.com| 欧美成人在线影院| 按摩亚洲人久久| 久久久免费高清电视剧观看| 国产综合久久久久久| 欧美肥婆姓交大片| 久久久av一区| 日韩在线观看你懂的| 91av在线网站| 欧美香蕉大胸在线视频观看| 国产男女猛烈无遮挡91| 亚洲欧美制服第一页| 欧美日韩午夜激情| 欧美激情精品久久久久| 色青青草原桃花久久综合| 欧美成在线观看| 欧洲精品在线视频| 91在线播放国产| 国产精品久久在线观看| 日韩av一卡二卡| 日韩电视剧在线观看免费网站| 91视频九色网站| 韩国v欧美v日本v亚洲| 91欧美日韩一区| 日韩美女免费观看| 亚洲一区二区少妇| 精品国内亚洲在观看18黄| 中文字幕亚洲欧美一区二区三区| 成人免费视频在线观看超级碰| 日韩欧美在线视频| 久久婷婷国产麻豆91天堂| 午夜精品一区二区三区在线播放| 日韩在线播放视频| 久久夜色精品国产欧美乱| 国产精品视频公开费视频| 色偷偷偷综合中文字幕;dd| 亚洲性无码av在线| 国产成人精品久久亚洲高清不卡| 亚洲午夜性刺激影院| 亚洲天堂男人天堂| 欧美激情一区二区三区成人| 日韩中文第一页| 欧美激情极品视频| 深夜精品寂寞黄网站在线观看| 欧美高清在线视频观看不卡| 久久影院在线观看| 亚洲精品国产综合久久| 成人免费网站在线看| 自拍偷拍亚洲精品| 琪琪第一精品导航| 国产精品视频免费在线| 日本视频久久久| 狠狠色狠狠色综合日日小说| 欧美高清视频一区二区| 成人在线中文字幕| 欧美激情区在线播放| 国产一区二区丝袜高跟鞋图片| 国产a级全部精品| 一区国产精品视频| 少妇高潮 亚洲精品| 久久亚洲国产精品| 亚洲欧美日韩天堂一区二区| 国产精品久久久久久久久久久新郎| 久久天天躁狠狠躁夜夜躁| 久久精品国产亚洲精品| 久久人人爽亚洲精品天堂| 国产91|九色| 日韩av电影在线网| 日韩精品在线视频观看| 中文字幕国内精品|