靜態庫.a文件和.framework文件
一、簡介
什么是庫:庫是程序代碼的集合,是共享程序代碼的一種方式。
根據源代碼公開情況,庫可以分為兩種:開源庫和閉源庫
開源庫
公開源代碼,能看到具體實現。如:SDWebImage、AFNetworking
閉源庫
不公開源代碼,是經過編譯后的二進制文件,看不到具體實現
閉源庫主要分為:靜態庫和動態庫
二、靜態庫和動態庫
靜態庫和動態庫的存在形式
靜態庫:.a和.framework
動態庫:.dylib和.framework
靜態庫和動態庫在使用上的區別
靜態庫:連接時,靜態庫會被完整的復制到可執行文件中,被多次使用就有多份冗余拷貝

動態庫:連接時不復制,程序運行時有系統動態加載到內存,提供程序調用,系統只加載一次,多個程序共用,節省內存

注意:項目中使用了自制的動態庫,不能被上傳到AppStore
三、制作.a文件
1、選擇“Cocoa Touch Static Library”

2、輸入靜態庫名稱

3、添加庫需要包含的源代碼


4、選擇需要暴露出來的.h文件,.m文件會自動編譯到.a文件中

5、選擇真機設備,然后 Command+B 編譯,libMJRefresh.a文件從紅色變為黑色
選擇模擬器,依然 Command+B ,模擬器和真機環境下用的.a文件是分開的

6、右擊“Show In Finder”,查看制作好的.a文件
Debug-iphoneos文件夾里面的東西是用在真機上的
Debug-iphonesimulator文件夾里面的東西是用在模擬器上的
如果Scheme是Release模式,生成的文件夾就以Release開頭
7、合並.a文件
1)如果想讓一個.a文件能同時用在真機和模擬器上,需要進行合並。
在終端輸入指令:
lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a
ü 藍色部分是固定指令
ü 紅色、紫色是真機和模擬器.a文件的路徑
ü 綠色是所合成.a文件的路徑
2).a文件的體積(一般情況下)
真機用的.a > 模擬器用的.a
所合成.a == 真機用的.a + 模擬器用的.a
3)通過lipo –info libMJRefresh.a可以查看 .a 的類型(模擬器還是真機)
4)使用.a文件:
直接將.a、.h、資源文件拖拽到其他項目中即可

四、手工制作.framework文件
1、選擇“OS X”-“Framework & Library”-“Bundle”

2、輸入靜態庫名稱

3、修改配置
1)剛才是基於OS X創建的工程,所以得修改項目環境為iOS的

修改Linking

2)修改Packaging

3)修改Info.plist

4)注釋掉pch文件的內容

5)添加庫需要包含的源代碼

6)添加需要暴露出來的 .h 文件


7)添加需要暴露出來的 .h 文件,並且放到Public下面

4、生成.framework文件
跟 .a 是一樣的,分別選擇真機和模擬器,Command+B
真機和模擬器下的 .framework 也是分開使用的
生成的framework在Xcode的緩存文件夾中
/Users/用戶名/Library/Developer/Xcode/DerivedData/項目名/Products
5、合並.framework文件
可以在終端下使用lipo指令合並 .framework, 需要合並的是framework里面的某個文件

直接拖拽整個 .framework 到其他項目的Frameworks文件夾下
然后包含主頭文件:#import <MJRefresh/MJRefresh.h>

五、模板制作.framework
手工制作 .framework 過於復雜,借助開源模板進行制作會比較簡單
模板地址https://github.com/kstenerud/iOS-Universal-Framework
1、安裝模板
在終端下進入iOS-Universal-Framework/Fake Framework文件夾
執行指令./install.sh
安裝模板后,完全重啟Xcode

2、最后將 .framework 的結構調整一下即可

六、制作靜態庫的注意點
1、無論是.a靜態庫還是.framework靜態庫,最終需要的都是:
二進制文件+.h+其他資源文件
2、.a和.framework的使用區別
.a本身是一個二進制文件,需要配上.h和其他資源文件才能使用
.framework本身已經包含了.h和其他資源文件,可以直接使用
3、圖片資源處理
如果靜態庫中用到了圖片資源,一般放到一個bundle文件中,bundle名字一般跟.a或者.framework名字一致
Bundle的創建:新建一個文件夾,擴展名改為.bundle即可,郵寄bundle文件,顯示包內容,就可以往包里放東西
4、多文件處理
如果靜態庫要暴露出來的.h文件比較多,可以考慮創建一個主頭文件(主頭文件一般和靜態庫同名)
在主頭文件中包含所有其他需要暴露出來的.h文件,在使用靜態庫的時候只需要:#import<主頭文件名>
5、.framework為什么既是靜態庫又是動態庫
系統的.framework是動態庫
我們自己創建的.framework是靜態庫
6、靜態庫中包含了Category
如果靜態庫中包含了Category,有時候在使用靜態庫的工程中會報“方法找不到”的錯誤(unrecognized selector sent to instance)
解決方案:在使用靜態庫的工程中配置Other Linker Flags為-ObjC

