在項目的進行中,即使很忙的項目,花一定的時間重構項目都不失為一件必須做的事。即使沒到生死攸關也和項目的健康發展和按時提交
以及老生常談的后期維護都有很大的關系。
在iOS項目開發中,重用代碼的方法有很多種。一般來說,你可以把代碼以Template的方式提升成基類子類的形式或者以Strategy的方式提升成
組成的方式。但是當代碼量相當大,且在多個項目中共用同一批代碼文件的時候,就需要把這些代碼組成靜態庫的方式服用了(在iOS項目中只能使用靜態庫)。
也就是說把這些公用代碼打包成靜態庫和可用的頭文件分發給需要用到這些代碼的Developer手中。或者用Xcode模板,把你的代碼打包成framework,就像系統
提供的SDK一樣,其中就包含了靜態庫和對應的public的頭文件。點擊這里獲取這個Xcode模板。
這里主要強調靜態庫的創建。在創建靜態庫的時候,如果你選擇了schema->iPhone (Version) Simulator,之后編譯。你得到的靜態庫是不能真機上使用的。
of course如果你不走這一步,那么你得到的靜態庫又是不能在模擬器中使用的。這時就需要用到xcode的target功能了。
不同的target之間可以共享受代碼。也就是對應於真機和模擬器創建不同的target,之后編出對應不同平台的靜態庫。具體做法:
首先創建一個靜態庫的項目。
我這里就取名叫Test123。之后你會看到如下的項目結構
你可以在項目中按照需要做添加修改等操作。
這個時候就需要再建另外的一個target。點擊你的項目,右擊已經存在的target的名字,在彈出菜單中選擇duplicate
就會生成另外的一個target。而且代碼全部都會reference到之前的代碼上。
但是,默認生成的target名字一般不是你想要的。這里duplicate出來的target會叫做Test123 copy。這里我們需要默認生成的target
支持模擬器,第二個target支持真機。所有需要給這個庫加一個后綴標識出來,Test123-ios。這個名字在對應於這個target的Build Settings中修改。
如圖:
在圖中你會看到第二個target叫Test123-other,如果這對生成的庫名稱沒有影響。如果你不喜歡,可以雙擊修改名字。
這個時候,兩個target就已經建好了。只需要針對不同的平台編譯就可以的到你想要的靜態庫。
首先在Schema中選擇第一個target,然后選擇iPhone(iPad也可以)Simulator。然后編譯。
你就會得到一個支持模擬器的靜態庫。
然后選擇第二個target,選擇iOS Device,編譯,你會得到一個支持真機的靜態庫。
打開Organizer,不知道在哪兒?好吧,在Xcode工具欄的最右邊或者一起按下shift+cmd+2你就會看到了。
在organizer中選擇Projects,然后點紅圈的地方。你就會看到你的項目的生成目錄。
項目會根據不同的平台生成不同的目錄。雖然這些目錄都是Debug開頭的。但是也可以也Release開頭。
畢竟,如果你只是想分發你的靜態庫給其他的Developer用不能給他們Debug版的。
還是在剛才選擇模擬器的地方,這次選擇Edit Scheme。
在Run里選擇Info tab下的Build Configuration,然后選Release。之后再編譯就可以了。
全文到此為止。記得,在使用靜態庫的時候把必要的頭文件加到調用項目中。你還可以在對應的target的Building Settings的Prefix Header中設置對應的pch文件。
同時可以使用lipo命令可以把生成的兩種平台的靜態庫打包成一個Universal靜態庫。簡單介紹下:使用Terminal跳轉到剛剛說的目錄下,然后鍵入如下命令
lipo –create Release-iphoneos/libiphone.a Debig-iphonesimulator/libiphone.a –output libiphone.a
記得根據實際靜態庫名稱修改命令中的名稱。網上很多介紹這個那個的方法配置來配置去很是麻煩,還不如這樣簡單可靠!