為什麽ios框架不是二進制調試時能看到的代碼?
我覺得這個打包框架還是壹個重要的功能,可以用來做以下事情:(1)打包功能模塊,比如把成熟的功能模塊打包成壹個包,然後方便自己或者其他同事以後使用。(2)包裝項目。有時候壹個公司找兩個開發公司做兩個項目,然後讓他們的壹個項目嵌套到另壹個項目裏。這時候把嵌套的項目打包成壹個框架就方便了。為什麽我們需要壹個框架?以壹種開發者友好的方式來享受這個庫是很麻煩的。您不僅需要包含庫本身,還需要包含所有頭文件、資源等等。蘋果解決這個問題的方法是框架。基本上,這是壹個具有固定結構的文件夾,包含引用庫所需的壹切。不幸的是,iOS禁止所有的動態庫。同時,蘋果還從Xcode中移除了創建靜態iOS框架的功能。Xcode仍然可以支持創建幀的功能。要重啟這個功能,我們需要對Xcode做壹些小的改動。app store允許將代碼封裝在靜態框架中。雖然形式不同,但本質上還是壹個靜態庫。框架的分類大多數框架都是動態鏈接庫的形式。因為只有蘋果可以在iOS設備上安裝動態庫,所以我們無法創建這種類型的框架。靜態鏈接庫和動態庫是壹樣的,只不過是在編譯時鏈接二進制代碼,所以使用靜態庫不會出現和動態庫壹樣的問題(就是除了蘋果,沒有人能在iOS上使用動態庫)。?假的?框架是通過破解Xcode的目標捆綁包(使用壹些腳本)實現的。表面上和使用中與靜態框架沒有區別。?假的?框架項目的功能和真正的框架項目幾乎是壹樣的(不是全部)。?嵌入式?框架是靜態框架的包裝器,這樣Xcode就可以獲取資源(圖片、plist、nib等。)在相框裏。這個版本包括靜態框架的創建和?假的?框架的模板,以及二者?嵌入式?框架。妳用什麽樣的模板?這個版本中有兩個模板,每個模板都有?強勢?軟弱?兩類。可以選擇最適合自己的(或者兩個都裝)。最大的區別是Xcode無法創建?真的嗎?框架,除非在Xcode中安裝靜態框架文件xcspec。這真的很可惜(這個文件是針對項目的,不是框架的)。簡而言之,妳可以決定使用哪個模板:如果妳不想修改Xcode,請使用它。假的?框架版如果只是想* * *享受二進制(不是項目),兩者都可以。想和不想修改Xcode的開發者分享框架* * *就用?假的?框架版本如果想和修改過Xcode的開發者分享框架,用?真的嗎?框架版本如果您想將壹個框架項目作為另壹個項目的依賴項(通過工作區或子項目),請使用?真的嗎?框架(或者?假的?框架,使用-框架?見後面)如果妳想把其他靜態庫/框架添加到妳的框架項目中,並把它們鏈接到最終結果,這樣妳就不需要單獨把它們添加到用戶項目中,用?假的?框架?假的?框架?假的?框架裂了?可重定位的目標文件?(可重定位格式的目標文件,保存代碼和數據,適合與其他目標文件鏈接,以創建可執行的目標文件或可欣賞的目標文件)。它允許Xcode編譯類似框架的東西?其實是壹捆。?偽框架?模板把整個過程分成幾個步驟,用壹些腳本生成壹個真正的靜態框架(基於靜態庫而不是可重定位的對象文件)。而且,框架項目是否還將其定義為wrapper.cfbundle類型,壹種Xcode?二等公民?。所以這和……真的嗎?靜態框架也可以工作得很好,但是當存在依賴時,它們就有麻煩了。依賴關系問題如果不使用依賴關系,只是創建壹個普通的項目是沒有問題的。但是如果使用項目依賴(比如在workspace中),Xcode就是壹個悲劇。當妳點擊。將二進制與庫鏈接?下面?+?按鈕,?偽框架?無法在列表中顯示。妳可以從妳的。假的?手動拖動到產品下的框架項目中,但編輯主項目時會出現警告:警告:跳過文件'/somewhere/my framework . framework '(框架中意外的文件類型' wrapper . cf bundle ' & amp;庫構建階段)伴隨著?假的?幀中的鏈接錯誤。還好有辦法解決。妳可以在這裏。其他鏈接器標誌?有用嗎?-弗雷姆沃克?Switch手動告訴鏈接器使用妳的框架鏈接:-framework MyFramework警告仍然存在,但至少可以正確鏈接。添加其他庫/框架如果您將其他靜態(非動態)庫/框架添加到您的?假的?在框架項目中,他們會?鏈接?到最終的二進制框架文件中。妳在線嗎?真的嗎?在框架項目中,它們是純粹的引用,而不是鏈接。您可以通過在項目中只包含頭文件而不是靜態庫/框架本身(用於編譯)來避免這種情況。?真的嗎?框架?真的嗎?框架是否符合各個方面?真的嗎?標準。這是壹個真正的靜態框架,正如它是使用蘋果從Xcode中移除的功能創建的壹樣。為了創建壹個真正的靜態框架項目,必須在Xcode中安裝壹個xcspec文件。如果妳出版壹本?真的嗎?框架項目(不是編譯),想編譯這個框架的人還必須安裝xcspec文件(使用這次發布的安裝腳本),這樣Xcode才能理解目標類型。註意:如果您發布的是完全編譯的框架,而不是框架項目,最終用戶不需要安裝任何東西。我已經向蘋果提交了壹份報告,希望他們用Xcode更新這個文件,但那需要壹點時間。OpenRadarlink這裏加上其他靜態庫/框架。如果妳在自己的基礎上增加其他靜態(非動態)庫/框架?真的嗎?框架項目,他們只會引用,不會點贊?假的?幀也鏈接到最終的二進制文件。從早期版本升級如果您從Mk6或早期版本升級並同時使用它?真的嗎?靜態框架,並且使用4.2.1之前的Xcode,請運行uninstall_legacy.sh卸載Xcode之前的所有修復。然後運行install.sh,重啟Xcode。如果使用Xcode4.3,只需運行install.sh,重啟Xcode即可。通過分別在真實框架目錄或假框架目錄中運行install.sh腳本來安裝(或者您可以同時運行這兩個目錄)。重啟Xcode,妳就在新建項目向導的框架裏了& amp;見庫下的StaticiOS框架(或者假的Static iOS框架)。要卸載,請運行unistall.sh腳本並重新啟動Xcode。創建iOS框架項目創建新項目。項目類型選擇框架&;庫下的靜態iOS框架(或者偽靜態iOS框架)。選擇?包括單元測試?(可選)。添加課程、資源等。到目標。其他項目要使用的任何頭文件都必須聲明為公共的。進入目標的Build Phases頁面,復制Headers項,並將需要公開的頭文件從項目或私有部分拖到公共部分。編譯您的iOS框架,選擇指定目標的方案,並修改方案的運行配置(可選)。默認情況下,運行配置使用調試,但是在準備部署時,您可能希望使用發布。編譯框架(無論目標是iOS設備還是模擬器,都會編譯相同的二進制,所以選擇誰並不重要)。從產品中選擇您的框架。在Finder中顯示?。構建目錄下有兩個文件夾:(yourframework)。框架和(妳的框架)。嵌入式框架。如果妳的框架只有代碼,沒有資源(比如圖片、腳本、xib、coredata的momd文件等。),可以分發(妳的框架)。框架給妳的用戶。如果它還包含資源,則必須分發。嵌入式框架給妳的用戶。為什麽需要嵌入式框架?因為Xcode不在靜態框架中尋找資源,如果妳分發(妳的框架)。框架,框架中的所有資源都不會顯示,也不可用。嵌入式框架只是框架之外的壹個附加包,包括這個框架所有資源的符號鏈接。這樣做的目的是讓Xcode能夠找到這些資源。使用iOS框架,iOS框架類似於常規的Mac OS動態框架,只是它是靜態鏈接的。在妳的項目中使用壹個框架,只要把它拖到妳的項目中。當包含頭文件時,記得用尖括號而不是雙引號將框架名括起來。例如,如果Xcode找不到MyFramework的頭文件:#import可能忘記將它們聲明為public。參考?創建iOS框架項目?第五步。沒有這樣的產品類型如果妳沒有在Xcode中安裝iOS通用框架並試圖編譯壹個通用框架項目(對於?真的嗎?框架,不是嗎?假的?Framework),這樣會導致以下錯誤:針對特定的產品類型' com . apple . product-type . framework . static ',但是對於' iPhone Simulator '平臺沒有這樣的產品類型進行編譯?真的嗎?IOS靜態框架,Xcode需要做壹些改動,所以為了編譯?真的嗎?靜態框架項目,請安裝在所有開發環境中(使用框架的用戶不需要,編譯框架時才需要)。所選的運行目的位置對此操作無效。有時,Xcode會出錯並載入錯誤的活躍設置。首先,嘗試重啟Xcode。如果錯誤仍然存在,Xcode會生成壹個不好的項目(由於Xcode4中的壹個bug,這個問題會出現在任何類型的項目中)。如果是這樣,您需要創建壹個新項目並重新開始。鏈接警告首次編譯框架目標時,Xcdoe會報告文件夾:LD: Warning:未找到選項'-L/Users/My self/Library/Developer/XCode/Derived Data/My framework-ccahfocjqiognaqraesrxdyqcne/build/products/debug-iphoneos '的目錄,此時可以清理並重新編譯目標,警告會消除。框架項目和應用項目找不到核心數據momd,Xcode以不同的方式編譯momd(托管對象模型文件)。Xcode只是在根目錄下創建壹個. mom文件,而不是創建壹個. mom目錄(包含VersionInfo.plist和。媽媽文件)。這意味著,當從嵌入式框架的模型實例化NSManagedObjectModel時,必須使用。mom擴展名作為模型的URL,而不是。媽媽分機。NSURL * modelURL =[[ns bundle main bundle]URLForResource:@ " my model " with extension:@ " mom "];接口生成器文件中的未知類my class。因為靜態框架使用靜態鏈接,所以linker會剔除所有它認為沒用的代碼。不幸的是,鏈接器不檢查xib文件,所以如果在xib中而不是在O-C代碼中引用該類,鏈接器將從最終的可執行文件中刪除該類。這是鏈接器問題,不是框架問題(編譯靜態庫時也會出現這個問題)。蘋果的內置框架不會有這個問題,因為是運行時動態加載的,iOS設備固件中存在的動態庫是不能刪除的。有兩種解決方案:要求框架的最終用戶關閉鏈接器優化選項,方法是將-ObjC和-all_load添加到他們項目的其他鏈接器標誌中。在框架中添加對另壹個類的代碼引用。例如,假設您有壹個MyTextField類,它被鏈接器消除了。假設妳還有壹個MyViewController,它在xib中使用了MyTextField,MyViewController還沒有被淘汰。妳應該這樣做:在MyTextField中:+(void)forceLinkerLoad_ {}在MyViewController中:+(void)initialize {[MyTextField forceLinkerLoad _];}他們仍然需要在鏈接器設置中添加-ObjC,但是不需要強制all_load。第二種方法需要您做更多的工作,但它允許最終用戶在使用您的框架時避免關閉鏈接器優化(關閉鏈接器優化將導致目標文件膨脹)。框架中意外的文件類型“wrapper.cfbundle”。這個問題發生在庫的構建階段?假的?當框架項目是工作區或子項目(?真的嗎?框架項目沒有這個問題)。這種框架項目雖然產生了正確的靜態框架,但是Xcode只能從項目文件中看出它是壹個bundle,所以在檢查依賴關系時會發出警告,在鏈接器階段會跳過。在鏈接階段,您可以手動添加命令以使鏈接器正確鏈接。將:-frameworkmyframewarning添加到依賴於您的靜態框架的項目的其他鏈接器標誌,但這不會導致鏈接失敗。不幸的是,庫被鏈接或者沒有被鏈接到最終的框架中,真的嗎?框架和?假的?框架模板在處理導入的靜態庫/框架時有不同的工作方式。?真的嗎?框架模板采用正常的靜態庫生成步驟,不會將其他靜態庫/框架鏈接到最終產品。?假的?框架模板采用?出軌?Xcode意味著它正在編譯壹個可重定位格式的目標文件。在鏈接階段,就像編譯壹個可執行文件壹樣,將所有靜態代碼文件鏈接成最終產品(雖然不會檢查目標代碼是否為真)。為了實現形象?真的嗎?Frame具有相同的效果,您只能將庫/frame的頭文件包含到您的項目中,而不包含庫/frame本身。(某個帶有category方法的類)中無法識別的選擇器如果您的靜態庫或靜態框架包含壹個模塊(只在類代碼中聲明,而不是由類實現),鏈接器將會感到困惑,並將代碼從二進制文件中移除。因為最終生成的文件中沒有這樣的方法,所以在調用該類別中定義的方法時,會出現壹個?無法識別的選擇器?不正常。要解決這個問題,在包含這個類別的模塊代碼中增加壹個?假的?班級。鏈接器發現有壹個完整的O-C類,並將類代碼鏈接到模塊。我寫了壹個頭文件LoadableCategory.h來減少這個工作量:# import " somencore class+my additions . h " # import " loadable category . h " make _ categories _ loadable(somencore class _ my additions);@實現壹些具體的類(myadditions)...@ end使用該框架時,還需要在Build設置的其他鏈接器標誌中添加-ObjC。單元測試在執行任何代碼之前崩潰。如果在Xcode4.3中創建靜態框架(或庫)目標,檢查壹下?使用單元測試?當您嘗試運行單元測試時,它將崩潰:thread 1:exc _ bad _ access(code = 2,address = 0x 0)0 0x 00000000-15 dyldbootstrap:start(...)這是lldb的壹個bug。您可以使用GDB來運行單元測試。編輯方案,選擇測試,並在信息選項卡中將調試器從LLDB更改為GDB。