原文網址:http://www.cnblogs.com/wendingding/p/3893095.htmlhtml
iOS開發拓展篇—靜態庫框架
1、簡單介紹iphone
1.什麼是庫?htm
庫是程序代碼的集合,是共享程序代碼的一種方式blog
2.庫的分類圖片
根據源代碼的公開狀況,庫能夠分爲2種類型ip
(1)開源庫內存
公開源代碼,能看到具體實現資源
好比SDWebImage、AFNetworking開發
(2)閉源庫
不公開源代碼,是通過編譯後的二進制文件,看不到具體實現
主要分爲:靜態庫、動態庫
2、靜態庫和動態庫
1.靜態庫和動態庫的存在形式
靜態庫:.a 和 .framework
動態庫:.dylib 和 .framework
2.靜態庫和動態庫在使用上的區別
靜態庫:連接時,靜態庫會被完整地複製到可執行文件中,被屢次使用就有多份冗餘拷貝(圖1所示)
動態庫:連接時不復制,程序運行時由系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存(圖2所示)
圖1
圖2
注意點:項目中若是使用了自制的動態庫,不能被上傳到AppStore
3、靜態庫的製做(.a)
(1)選擇「Cocoa Touch Static Library」
(2)輸入靜態庫名稱(以MJRefresh爲例)
(3)刪除自動生成的文件
(4)添加庫須要包含的源代碼
注意:資源文件是不能打包到.a文件中的。
(5)選擇須要暴露出來的.h文件,.m文件會自動編譯到.a文件中
添加,並選擇須要暴露的頭文件
設置(移動)爲公開的。
(6)選擇真機設備,而後 Command+B 編譯,libMJRefresh.a文件從紅色變爲黑色
這個時候,程序會報錯,由於框架中包含了CGFloat,它是UIKit裏面的東西,所以能夠在pch文件中包含UIKit框架。
再次進行編譯,編譯成功後生成的.a文件就是靜態庫。
(7)選擇模擬器,依然 Command+B ,模擬器和真機環境下用的.a文件是分開的
(8)右擊「Show In Finder」,查看製做好的.a文件
說明:
Debug-iphoneos文件夾裏面的東西是用在真機上的
Debug-iphonesimulator文件夾裏面的東西是用在模擬器上的
若是Scheme是Release模式,生成的文件夾就以Release開頭
(9)合併兩個文件
若是想讓一個.a文件能同時用在真機和模擬器上,須要進行合併
在終端輸入指令:
lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a
說明:
藍色部分是固定指令
紅色、紫色是真機和模擬器.a文件的路徑
綠色是所合成.a文件的路徑
生成的文件(靜態庫)
提示:
1)文件大小.a文件的體積(通常狀況下)
真機用的.a > 模擬器用的.a
所合成.a == 真機用的.a + 模擬器用的.a
2).a的類型
經過lipo –info libMJRefresh.a能夠查看 .a 的類型(模擬器仍是真機)
(10)如何使用.a
直接將.a、.h、資源文件拖拽到其餘項目中便可
別人拿到的框架,只有.a文件和暴露出來的頭文件
注意:若是庫中還包含了一些資源文件(如圖片等),那麼資源文件也應該放在上面的文件夾中。
4、製做靜態庫的注意點
(1)注意:
不管是 .a 靜態庫仍是 .framework 靜態庫,最終須要的都是:二進制文件 + .h + 其它資源文件
(2).a 和 .framework 的使用區別
.a 自己是一個二進制文件,須要配上 .h 和 其它資源文件 才能使用
.framework 自己已經包含了 .h 和 其它資源文件,能夠直接使用
(3)圖片資源的處理
若是靜態庫中用到了圖片資源,通常都放到一個bundle文件中,bundle名字通常跟 .a 或 .framework 名字一致
bundle的建立:新建一個文件夾,修改擴展名爲 .bundle 便可,右擊bundle文件,顯示包內容,就能夠往bundle文件中放東西
建議:本身製做的靜態庫中要用到的圖片資源,不建議直接以png的後綴名方式拖到項目中使用,而是推薦使用放到bundle文件中。這樣能夠避免靜態庫的圖片名和使用靜態庫的項目中存在的圖片產生衝突。
1)新建一個文件夾,把須要打包的資源圖片放在裏面
2)修改擴展名爲 .bundle,敲回車,點擊添加。
(4)多文件處理
若是靜態庫須要暴露出來的 .h 比較多,能夠考慮建立一個主頭文件(通常 主頭文件 和 靜態庫 同名)
在主頭文件中包含全部其餘須要暴露出來的 .h 文件
使用靜態庫時,只須要#import 主頭文件
實際上蘋果官方就是這麼作的,例如:#import <UIKit/UIKit.h>
(5).framework爲何既是靜態庫又是動態庫
系統的 .framework 是動態庫
咱們本身創建的 .framework 是靜態庫
(6)靜態庫中包含了Category(分類)
若是靜態庫中包含了Category,有時候在使用靜態庫的工程中會報「方法找不到」的錯誤(unrecognized selector sent to instance)
解決方案:在使用靜態庫的工程中配置Other Linker Flags爲-ObjC