中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
iOS封裝功能生成 .framework

前言

      如果你想將你開發(fā)的控件與別人分享,一種方法是直接提供源代碼文件。然而,這種方法并不是很優(yōu)雅。它會(huì)暴露所有的實(shí)現(xiàn)細(xì)節(jié),而這些實(shí)現(xiàn)你可能并不想開源出來。此外,開發(fā)者也可能并不想看到你的所有代碼,因?yàn)樗麄兛赡軆H僅希望將你的這份漂亮代碼的一部分植入自己的應(yīng)用中。

      另一種方法是將你的代碼編譯成靜態(tài)庫(library),讓其他開發(fā)者添加到自己的項(xiàng)目中。然而,這需要你一并公布所有的公開的頭文件,實(shí)在是非常不方便。

你需要一種簡單的方法來編譯你的代碼,這種方法應(yīng)該使得你的代碼易分享,并且在多個(gè)工程中易復(fù)用。你需要的是一種方法來打包你的靜態(tài)庫,將所有的頭文件放到一個(gè)單元中,這樣你就可以立刻將其加入到你的項(xiàng)目中并使用。

      OS X完美地支持這一點(diǎn),因?yàn)閄code就提供了一個(gè)項(xiàng)目模板,包含著默認(rèn)構(gòu)建目標(biāo)(target)和可以容納類似于圖片、聲音、字體等資源的文件。你可以為iOS創(chuàng)建Framework,不過這是一個(gè)比較復(fù)雜的手工活,如果你跟著教程走,你將學(xué)到怎么樣跨過路障,順利地完成Framework的創(chuàng)建。

比較

可以參考這篇文章.a和.framework.a和.framework的區(qū)別


我們可以看出.a的封裝和.framework的封裝差不多,也有模擬器和真機(jī)合并的過程,通過上邊的圖片我們可以看出.a 和.framework的區(qū)別,就是.a .h soureFile=.framework??梢钥闯鑫覀冎苯臃庋b.framework其實(shí)是最好的。那么我們就來看看framework怎么封裝的。

另外關(guān)于.a的封裝大家可以參考iOS如何生成.a文件

目標(biāo)

      本文將基于Xcode7創(chuàng)建一個(gè)簡單的工程,通過兩種方法來教大家如何制作一個(gè)自己的framework,目的就是簡單易學(xué)的制作framework。這種方法可以使得你的代碼易分享,在多個(gè)工程中復(fù)用,并且可以隱藏實(shí)現(xiàn)細(xì)節(jié),控制公開的頭文件。

步驟

1、打開Xcode,新建工程。

不要選擇“Application”,選擇“Framework & Library”。選擇第一個(gè),然后Next。


2、創(chuàng)建功能類。

這里我創(chuàng)建一個(gè)繼承自NSObject的SayHello類

3、實(shí)現(xiàn)功能。

在新創(chuàng)建的類里面聲明方法并實(shí)現(xiàn)。這里我寫一個(gè)sayHello的方法,以便后面測試使用。


4、更改參數(shù)

在TARGETS下選中工程,在Build Settings下更改幾個(gè)參數(shù)。


5、增加armv7s

  在Architectures下增加armv7s,并選中。將Build Active Architecture Only 設(shè)置為NO。


6、設(shè)置Headers

將你要公開的頭文件拖至Public下,要隱藏的放在Private或者Project下,當(dāng)然,隱藏的頭文件就無法再被引用。


然后需要在Test.h(必須是公開的,否則無法引用)中將你所有要公開的.h引入。


 

 

打包Framework

第一種方法

1.選中模擬器,編譯程序

2.選中測試機(jī),編譯程序

3.在finder中找到framework文件


選中圖中所標(biāo)示的framework,然后右鍵show in finder。

找到下圖中所示的Test文件,一個(gè)是Debug-iphoneos(真機(jī))下的,一個(gè)是Debug-iphonesimulator(模擬器)下的。


4.通過終端命令將兩個(gè)framework合為一個(gè)模擬器和真機(jī)都可使用的framework。

打開控制臺(tái)輸入 lipo -create iphoneos下frameworkTest的路徑 simulator下frameworkTest的路徑 -output 新的路徑,這樣就完成了模擬器和真機(jī)版本的合并,新路徑下的frameworkTest就是你合并后的文件,將這個(gè)文件名字改成和你未合并之前的Test一樣的名字,放到framework文件夾下,替換掉原來的frameworkTest文件。

上邊說的亂糟糟的,看不清楚,這里給大家解釋一下,看下邊的圖:打開終端,手動(dòng)輸入畫紅線的lipo -create命令,然后綠線是iphoneos下frameworkTest的路徑(找到iphoneos下frameworkTest的文件,拖拽進(jìn)來),會(huì)自動(dòng)有空格,紫線是simulator下frameworkTest的路徑(同樣找到simulator下frameworkTest的文件,拖拽進(jìn)來),也會(huì)自動(dòng)有空格,然后輸入-output,然后敲空格,在引入一個(gè)新的路徑(拖拽進(jìn)一個(gè)新的路徑),最后敲回車。這樣就完成合并了。


上面這段命令就是把真機(jī)和模擬器的frameworkTest合并成一個(gè)MyNewFrameworktest文件并存放在桌面上的New文件夾下。

這里我們合并的時(shí)候會(huì)遇到一個(gè)error,這是啥原因還真不知道,但是會(huì)在和我們-output的文件夾路徑并列的地方生成一個(gè).lipo文件,這個(gè).lipo文件我們下邊會(huì)說到。



注意:合并完成后會(huì)出現(xiàn)一個(gè)如下圖的.lipo格式的文件。


這TM是啥,不是應(yīng)該出現(xiàn)一個(gè)類似下圖的嗎?不應(yīng)該后綴什么也沒有嗎?怎么后綴會(huì)是.lipo,這是什么文件???!


我們的操作是按照人家說的把合成后的文件名字改成MyFrameworkTest替換原來的。而且,把后綴.lipo去掉!

在按照上述說的,替換了原來的。

然后就可以進(jìn)行下一步了。

5.將修改后的framework拷貝出來保存,這就是我們最終制作的framework。

第二種方法

1、選中TARGETS下的工程,點(diǎn)擊上方的Editor,選擇Add Target創(chuàng)建一個(gè)Aggregate.


2、選擇Other下的Aggregate,點(diǎn)擊Next創(chuàng)建。


3、嵌入腳本。選中剛剛創(chuàng)建的Aggregate,然后選中右側(cè)的Build Phases,點(diǎn)擊左下方加號(hào),選擇New Run Script Phase


將這段腳本復(fù)制進(jìn)去:

# Sets the target folders and the finalframework product.# 如果工程名稱和Framework的Target名稱不一樣的話,要自定義FMKNAME# 例如: FMK_NAME = 'MyFramework'FMK_NAME=${PROJECT_NAME}# Install dir will be the final output tothe framework.# The following line create it in the rootfolder of the current project.  INSTALL_DIR=${SRCROOT}/Products/$      {FMK_NAME}.framework# Working dir will be deleted after theframework creation.  WRK_DIR=build  DEVICE_DIR=${WRK_DIR}/Release-iphoneos/$                        {FMK_NAME}.framework  SIMULATOR_DIR=${WRK_DIR}/Release-  iphonesimulator/${FMK_NAME}.framework# -configuration ${CONFIGURATION}# Clean and Building both architectures.xcodebuild -configuration'Release'-target'${FMK_NAME}'-sdk iphoneos clean build  xcodebuild -configuration'Release'-target'${FMK_NAME}'-sdk iphonesimulator clean          build# Cleaning the oldest.if[-d'${INSTALL_DIR}']thenrm -rf'${INSTALL_DIR}'fimkdir -p'${INSTALL_DIR}'cp -R'${DEVICE_DIR}/''${INSTALL_DIR}/'# Uses the Lipo Tool to merge both binaryfiles (i386 armv6/armv7) into one      Universal final product.  lipo -create'${DEVICE_DIR}/${FMK_NAME}''${SIMULATOR_DIR}/${FMK_NAME}'-output'$                      {INSTALL_DIR}/${FMK_NAME}'rm -r'${WRK_DIR}'open'${INSTALL_DIR}'

這里有一個(gè)誤區(qū),就是復(fù)制上邊的這段腳本的時(shí)候,會(huì)在我們期望的效果里面多了幾個(gè)回車,這幾個(gè)回車是致命的,如果不刪除回車,會(huì)報(bào)出如下的錯(cuò)誤:



最后的格式如下圖,盡量一個(gè)回車也不能錯(cuò):


通過第一種方法中“把真機(jī)和模擬器的frameworkTest合并成一個(gè)”的過程和上邊的腳本語言比較,我們可以發(fā)現(xiàn)其實(shí)兩者異路同歸,兩個(gè)方法里面同時(shí)用到了“l(fā)ipo -create  xxx”和“-output xxx”,不同的地方是第一種方法需要我們自己真機(jī)和模擬器分別變異一遍,而且需要我們把framework的路徑拖進(jìn)去,相比而言第二種方法比較簡單。

4、編譯。如圖所示,command B編譯。這里Generic iOS Device的意思是“iOS通用設(shè)備”,大概就是說模擬器和真機(jī)都能用。


5、編譯成功后會(huì)自動(dòng)跳出一個(gè)finder,保存這個(gè).framework,這就是我們需要的framework。


至此,兩種打包framework的方法介紹完成!

 

 

最后就是用我們的Framework了,倒入另一個(gè)Xcode中,我們打開這個(gè)framework看看,發(fā)現(xiàn)只有Headers,里面有兩個(gè).h,其中一個(gè)是我們之前添加的FrameworkDemo.h文件,另一個(gè)就是我們的SayHello.h 。


然后引入頭文件:


由于我們測試的方法是實(shí)例方法,那么我們實(shí)例化一個(gè)實(shí)例對(duì)象,然后就可以讓這個(gè)實(shí)例對(duì)象調(diào)取相應(yīng)的方法了:


至此,完成Framework的制作和使用。

 

總結(jié)

最后需要注意的是:

1、.h文件的外漏一定要保證是自己的想要外漏的。不想外漏的就別外漏了。

2、開始打包的時(shí)候,一定要在選中模擬器和選中真機(jī)上邊分別編譯一次, 我覺得之前在家里沒有真機(jī)的時(shí)候編譯的好像不對(duì)。

3、在終端上邊合并的時(shí)候可能是error并生成一個(gè).lipo文件,不要怕,大膽修改成同名的不掛后綴的同名文件。

4、調(diào)用的時(shí)候分清楚是類方法還是實(shí)例方法,方便調(diào)用。

5、在制作framework或者lib的時(shí)候,如果使用了category,則使用改FMWK的程序運(yùn)行時(shí)會(huì)crash,此時(shí)需要在該工程中 other linker flags添加兩個(gè)參數(shù) -ObjC -all_load。(這點(diǎn)沒有親測)

6、帶有圖片資源的需要把圖片打包成Bundle文件,和framework一起拷貝到相應(yīng)的項(xiàng)目中。

7、公開的類中如果引用的private的類,打包以后對(duì)外會(huì)報(bào)錯(cuò),找不到那個(gè)private的類,可以把那個(gè)private的.h放到(也沒親測)

8、namespace 沖突。靜態(tài)庫用了某第三方庫,項(xiàng)目也用了同樣的第三方庫,在編譯的時(shí)候就會(huì)有 duplicate symbol 錯(cuò)誤,因?yàn)橛袃煞萃瑯拥牡谌綆?。解決辦法就是把用到的第三方庫加上自定義前綴,包括類名、delegate 協(xié)議、常量名,尤其需要注意 Category 的方法名要修改。

9、封裝靜態(tài)庫的時(shí)候應(yīng)盡量避免引入重量級(jí)第三方庫,多自己進(jìn)行封裝

10、一個(gè)靜態(tài)庫要有自己獨(dú)有的前綴,所有類名、常量等都要加同樣的前綴。

11、真機(jī) 模擬器支持。(和第2條意思一樣)Xcode 默認(rèn)只會(huì)用當(dāng)前環(huán)境(真機(jī)或模擬器)生成靜態(tài)庫,這樣的 SDK 不方便其他項(xiàng)目開發(fā)時(shí)調(diào)試。解決辦法就是通過腳本生成一份通用庫,build_universal_library.sh,via SO.

12、文檔。靜態(tài)庫的方便是使用者直接拿你提供的方法來用,無需關(guān)注具體實(shí)現(xiàn);不方便在于看不到實(shí)現(xiàn),出現(xiàn)問題無法排查,因此需要把 SDK 的版本、更新歷史、使用、FAQ 等寫成文檔,方便使用,也顯得 SDK 比較正式規(guī)范。

13、圖片等資源文件用 bundle 方式打包。一個(gè)簡單制作 bundle 的方法:新建文件夾,重命名為 YourSDK.bundle,然后 Show Package Contents 打開,加入圖片。使用圖片的時(shí)候需要指明 bundle: [UIImage imageNamed:@'YourSDK.bundle/img.png']。也可以用 Target 方式制作 bundle,比如 iOS Library With Resourceshttp://www.galloway.me.uk/tutorials/ios-library-with-resources/.

14、如果 SDK 有用到 Category,注意項(xiàng)目設(shè)置 Other Linker Flags 添加 -ObjC。(后邊介紹了-ObjC的作用)

補(bǔ)充

編譯過程:

從C代碼到可執(zhí)行文件經(jīng)歷的步驟是:源代碼 > 預(yù)處理器 > 編譯器 > 匯編器 > 機(jī)器碼 > 鏈接器 > 可執(zhí)行文件

在最后一步需要把.o文件和C語言運(yùn)行庫鏈接起來,這時(shí)候需要用到ld命令。源文件經(jīng)過一系列處理以后,會(huì)生成對(duì)應(yīng)的.obj文件,然后一個(gè)項(xiàng)目必然會(huì)有許多.obj文件,并且這些文件之間會(huì)有各種各樣的聯(lián)系,例如函數(shù)調(diào)用。鏈接器做的事就是把這些目標(biāo)文件和所用的一些庫鏈接在一起形成一個(gè)完整的可執(zhí)行文件。Other linker flags設(shè)置的值實(shí)際上就是ld命令執(zhí)行時(shí)后面所加的參數(shù)

下面逐個(gè)介紹3個(gè)常用參數(shù):

-ObjC:加了這個(gè)參數(shù)后,鏈接器就會(huì)把靜態(tài)庫中所有的Objective-C類和分類都加載到最后的可執(zhí)行文件中

-all_load:會(huì)讓鏈接器把所有找到的目標(biāo)文件都加載到可執(zhí)行文件中,但是千萬不要隨便使用這個(gè)參數(shù)!假如你使用了不止一個(gè)靜態(tài)庫文件,然后又使用了這個(gè)參數(shù),那么你很有可能會(huì)遇到ld: duplicate symbol錯(cuò)誤,因?yàn)椴煌膸煳募锩婵赡軙?huì)有相同的目標(biāo)文件,所以建議在遇到-ObjC失效的情況下使用-force_load參數(shù)。

-force_load:所做的事情跟-all_load其實(shí)是一樣的,但是-force_load需要指定要進(jìn)行全部加載的庫文件的路徑,這樣的話,你就只是完全加載了一個(gè)庫文件,不影響其余庫文件的按需加載

 

后期會(huì)試著把貝塞爾畫餅的demo封裝成framework,另外可能會(huì)增加Bundle文件的生成方法。

參考自1、iOS-制作Framework(最新)

          2、iOS--創(chuàng)建你自己的Framework

 

最后,哪里不對(duì)的地方可以給我留言,我會(huì)及時(shí)改進(jìn)的,謝謝大家。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ios framework通用庫的制作
iOS開發(fā)拓展篇
合并第三方真機(jī)和模擬器的.framework或(靜態(tài)庫.a)文件的方法
【iOS開發(fā)】打包靜態(tài)庫.a文件 – 斌少
xcode增加文件及庫文件
【H5+ & Quick
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服