引言:
此篇記錄在iOS中使用靜態庫時遇到的問題匯總和解決方案.
如何建立一個靜態庫:
1:主工程關聯靜態庫具體步驟
一:讓靜態庫與項目工程關聯起來
二:讓項目工程寫書寫代碼時,能夠得帶靜態庫中的標頭檔提示
三:為保證在修改靜態庫中的代碼編譯運行後能夠每次都取用最新的靜態庫而進行如下設定
Full Path 需要選擇 DerivedData 檔案夾裡面 具體編譯後所產生的 靜態庫檔案,這樣可以保證每次都使用最新的靜態庫檔案
二:解決靜態庫無法使用資源檔的方式:
首先,所有的資源檔都依舊依附在靜態庫中,然後對需要使用的工程傳入資源檔的引用即可.
將需要使用的資源檔拖動到工程中以後出現如中的設定選項:
三:靜態庫使用其他靜態庫的資源時,可直接設定 Header Search Path 即可,前提保證主工程都引用了這些靜態庫
四:解決在靜態庫中 使用 Category(類別) 產生的Crash
在調用靜態庫的主工程中進行如下設定即可解決問題:
Project->Build Settings->Other Linker Flags 添加值: -all_load
注:這種設定方法會讓所有與主工程有關的靜態庫和架構都載入其中的Category.
:
參考文章:
http://blog.csdn.net/leonpengweicn/article/details/6799994
Category 的使用參考:
http://blog.csdn.net/sanpintian/article/details/7406180
http://www.54xue.com/w/70/n-30670.html
如果要在類別中儲存變數,可以參考以下文章:
http://www.cnblogs.com/liping13599168/archive/2012/09/13/2682664.html
解決訊飛語音架構匯入後產生編譯不通過的解決方案:(將靜態庫單一設定其載入Category).
參考文章:
http://dev.voicecloud.cn/bbs/forum.php?mod=viewthread&tid=4154&extra=&page=1
1.去掉-ObjC -all_load參數(這個參數會強制所有的靜態連結庫都載入其中的category);
2.改為逐一載入Three20的各個靜態庫,即修改連結參數(Other Linker Flag)為如下形式:
-force_load $(BUILT_PRODUCTS_DIR)/libThree20.a
如:
五:如果你將整個檔案切換到了其他目錄後,XCode編譯時間可能產生目錄找不到的警告,如:
解決方案如下:
確定 Library Search Paths 的路徑是否指向正確:
六: Unknown class MyClass in Interface Builder file. 的解決辦法
設定 Other Linker Flag 的
-all_load
在使用靜態庫時,如果沒有設定-all_load . 那麼主工程在編譯時間是不會檢測是否引用應該引用的架構(framework).
但是使用是沒問題的,但是遇到需要架構才能執行的代碼會崩潰,另外xib也會報出 找不到相應的類,除非在代碼中主動調用.
七:靜態庫中的資源使用和管理的最佳解決方案.
使用Bundle捆綁包的方式來使用和管理資源.
步驟如下:
1:建立一個檔案夾,將其命名為xxx.bundle. 以後 Mac自定識別到並標識為捆綁包.
2:將靜態庫使用的相關資源拷貝的bundle裡面.
3:抒寫代碼的時候在路徑方面有所改變,如下:
[UIImage imageNamed:@"PullTableView.bundle/arrowhead_up.png"]
4:這一點是我的建議,將捆綁包還是放在靜態庫的目錄裡. 然後在拖動到主工程中時,不要選擇複製到執列區域.如設定即可: