最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS創(chuàng)建與使用靜態(tài)庫

 更新時間:2016年03月31日 15:19:41   作者:DDChina  
這篇文章主要為大家詳細介紹了iOS創(chuàng)建與使用靜態(tài)庫的相關資料,感興趣的小伙伴們可以參考一下

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

(一)iOS靜態(tài)庫、動態(tài)庫與Framework靜態(tài)庫與動態(tài)庫的區(qū)別

(1)什么是庫?

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

(2)什么是靜態(tài)庫?

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

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

③靜態(tài)庫的利弊:

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

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

(3)什么是動態(tài)庫?

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

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

③動態(tài)庫的利弊:

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

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

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

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

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

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

(5)iOS Framework?

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

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

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

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

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

(二)切入主題"iOS靜態(tài)庫的創(chuàng)建":

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

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

(2)Debug(調(diào)試)版本特點:

①含完整的符號信息,以方便調(diào)試;  ②不會對代碼進行優(yōu)化;

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

①不會包含完整的符號信息;  ②執(zhí)行代碼是進行過優(yōu)化的; ?、鄞笮菵ebug版本的略小  ④在執(zhí)行速度方面,Release版本會快一些;

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

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

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

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

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

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

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

    

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

"Library.h"
/** 十六進制轉(zhuǎn)二進制 */
+ (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)編譯項目生成對應的靜態(tài)庫.a文件(在這里注意一下細節(jié)):

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

      

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

      

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

    

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

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

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

    

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

(7)合并靜態(tài)庫:

①為什么要合并靜態(tài)庫呢?

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

②合并靜態(tài)庫的利弊?

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

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

③打開終端合并靜態(tài)庫(終于快成功了😄😄...)如圖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)靜態(tài)庫的使用:

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

"ViewController.h"
@interface ViewController : UIViewController

@end

"ViewController.m"
#import "ViewController.h"
#import "Library.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // 十六進制轉(zhuǎn)二進制
  NSLog(@"十六進制轉(zhuǎn)二進制: %@", [Library getBinaryByhex:@"F"]);
}

日志打印輸入結(jié)果是:
靜態(tài)庫的使用[1006:40288] 十六進制轉(zhuǎn)二進制: 1111

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

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

  

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

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

相關文章

  • IOS 通訊錄信息讀取兼容的實現(xiàn)方法

    IOS 通訊錄信息讀取兼容的實現(xiàn)方法

    這篇文章主要介紹了IOS 通訊錄信息讀取兼容的實現(xiàn)方法的相關資料,這里提供實現(xiàn)方法幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-08-08
  • iOS實現(xiàn)錄音轉(zhuǎn)碼MP3及轉(zhuǎn)碼BASE64上傳示例

    iOS實現(xiàn)錄音轉(zhuǎn)碼MP3及轉(zhuǎn)碼BASE64上傳示例

    本篇文章主要介紹了iOS實現(xiàn)錄音轉(zhuǎn)碼MP3及轉(zhuǎn)碼BASE64上傳示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-02-02
  • iOS超出父控件范圍無法點擊問題解決

    iOS超出父控件范圍無法點擊問題解決

    這篇文章主要介紹了iOS超出父控件范圍無法點擊問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • iOS實現(xiàn)文字水平無間斷滾動效果

    iOS實現(xiàn)文字水平無間斷滾動效果

    這篇文章主要為大家詳細介紹了iOS實現(xiàn)文字水平無間斷滾動效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • iOS NSTimer循環(huán)引用的幾種解決辦法

    iOS NSTimer循環(huán)引用的幾種解決辦法

    本篇文章主要介紹了iOS NSTimer循環(huán)引用的幾種解決辦法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Flutter之PageView頁面緩存與KeepAlive

    Flutter之PageView頁面緩存與KeepAlive

    這篇文章主要為大家介紹了Flutter之PageView頁面緩存與KeepAlive示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 分享一些iOS開發(fā)實用的小技巧

    分享一些iOS開發(fā)實用的小技巧

    這篇文章主要給大家分享了一些iOS開發(fā)實用的小技巧,這些小技巧在大家開發(fā)iOS的時候還是相當實用,有需要的朋友們下面來一起看看吧。
    2016-09-09
  • iOS仿抖音視頻加載動畫效果的實現(xiàn)方法

    iOS仿抖音視頻加載動畫效果的實現(xiàn)方法

    這篇文章主要給大家介紹了關于iOS視頻加載動畫效果的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,下面隨著小編來一起學習學習吧
    2018-11-11
  • IOS設置QQ小紅點消除的方法(一鍵退朝)

    IOS設置QQ小紅點消除的方法(一鍵退朝)

    這篇文章主要介紹了IOS設置QQ小紅點消除的方法(一鍵退朝),對ios設置小紅點消除相關知識感興趣的朋友一起學習吧
    2016-01-01
  • IOS開發(fā)過程中的消息通知--小紅點

    IOS開發(fā)過程中的消息通知--小紅點

    本文主要介紹了IOS開發(fā)過程中的消息通知--小紅點的相關知識。大致分為兩種方法:系統(tǒng)方法和自定義方法。下面跟著小編一起來看下吧
    2017-04-04

最新評論

紫阳县| 德格县| 宁河县| 安西县| 田东县| 大同市| 沾益县| 黔江区| 炎陵县| 重庆市| 泸溪县| 久治县| 文化| 拉萨市| 阳泉市| 莫力| 洛浦县| 河西区| 巴彦淖尔市| 石河子市| 乐清市| 福州市| 吴江市| 西乌珠穆沁旗| 阿坝县| 措美县| 盐边县| 扶绥县| 昌乐县| 济南市| 吴桥县| 曲水县| 安溪县| 大同市| 麻城市| 嘉善县| 资源县| 上林县| 和静县| 沂水县| 唐山市|