實際開發中,我們可能會同時開發好幾個端,比如樓主目前開發的家教平台,需要老師端,家長端,助教端三個端。有很多工具方法,或者封裝的自定義控件都是可以復用的。我們就可以把公用的代碼抽取出去,新建一個工程,統一管理。同步維護一份代碼,不需要在各個端各自維護。
創建子工程很簡單:
1 假設你已經有了自己的工程demo.xcodeproj,首先我們需要創建一個子工程,(File->new->project),我們要選擇靜態庫。如圖
點擊下一步,給子工程起名字:subProject
點擊下一步:選擇Add to自己的工程
到此,第一步就結束了,我們創建了一個子工程,而且也添加到了自己的工程裡面,但是,這樣在自己工程中還是無法引用子工程的類。我們還需要設置一下自己工程的環境變量。
2 設置環境變量:
自己的工程demo下,選擇Bulid Settings ,找到User Header Search Paths。設置自己工程的絕對路徑,然後設置遞歸查找文件夾。
3.添加target的依賴關系
我們要保證編譯demo的時候先編譯subProject。
選中demo Target,然後選中其Build phases選項,添加subProject target
還有生成的.a文件也得添加進來。選擇Link Binary With Libraries
這時候一些基本的方法已經可以用起來了。
4、如果子工程中有圖片或者依賴文件怎麼辦?
要把相關的依賴圖片copy出去:選中subProject target,進入Build phases選項,找到最下面的copy file欄,添加相關的文件:
5 如果存在category的時候,在demo工程Other Linker Flags裡面添加編譯的命令:
注意:在ios5以及以上版本中,引入別的工程(如上)或者靜態庫,
並且StoryBoards中使用了【引入的外部類(外部工程或者靜態庫裡面的類)】,
那麼Other Linker Flags 裡面必須加上-ObjC,否則,會console會報錯
error:Unknown class <外部的類名> in Interface Builder file.
引用:
http://developer.apple.com/library/mac/#qa/qa1490/_index.html -ObjC,This flag causes the linker to load every object file in the library that defines an Objective-C class or category 意思是,使用這個標識,會把靜態庫中,定義了Objective-C class的文件或者定義了category類別的文件,全部加載進來。 因為你的靜態庫裡面擴展了一個已存在的類的category,那麼這個category是不會加載進來的。 在程序運行中,調用此類別的方法,就會報錯“selector not recognized”。 Important: For 64-bit and iPhone OS applications, there is a linker bug that prevents
-ObjC from loading objects files from static libraries that contain only categories and no classes. The workaround is to use the -all_load
or -force_load
flags. 上面的意思是說
對於64位操作系統或者ios系統,-Objc存在一個bug,就是只包含categories ,而沒有任何class的靜態庫,是不會被加載進來。
拮據額這個bug:使用標識符:
-all_load 或者 -force_load
子工程導入完成。整個框架瞬間高大上起來了。參考文章:https://www.ganlvji.com/xcode_subproject_project_dependency/