1. 程式人生 > >iOS 引入framework的常見問題和原理

iOS 引入framework的常見問題和原理

今天在引入第三方framework時,我按照以前的方法,把framework加入到了下圖的地方:

預設是required的,之後程式就crash了,報錯dyld: Library not loaded,之後我把required 改成了optional,這次不crash了,但是執行時出錯,庫中的物件無法例項化,全部是空。

先看看optional 和 required 有什麼區別,如下是官方的說法:

Libraries and frameworks are designated as Required by default, but you can change this designation to Optional. Required libraries
must be present on the host computer for the product to load. Optional libraries do not have to be present for the product to load. A Required framework will always be loaded into memory, but an Optional framework will be loaded only if needed. The initial load of the application will be faster if a large library that is never needed is designated as Optional.

 在看看framework的官方說明:

A framework is a hierarchical directory that encapsulates shared resources, such as a dynamic shared library, nib files, image files, localized strings, header files, and reference documentation in a single package. Multiple applications can use all of these resources simultaneously. The system loads them into memory as needed and shares the one copy of the resource among all applications
whenever possible.

注意,根據上面的介紹,看起來framework中只能包含 dynamic shared library 2進位制檔案,其實不是,framework 中也可以包含靜態庫2進位制檔案!通過下面這個引數來指定:

這裡如果指定為 Static Library(framework中包含的2進位制檔案就是個靜態庫),那麼當這個framework就可以只加入Linked Frameworks and Libraries 選項卡中,系統會自動識別它的型別,並連結入目標檔案。而如果指定為Dynamic Library(framework 中包含的2進位制檔案就是個動態庫) ,那麼,加入到 Linked Frameworks and Libraries 選項卡中是不夠的,而是需要加入到Embeded Binaries選項卡中,加入後系統會自動為你在Linked Frameworks and Libraries選項卡里加入相同framework,開啟對應的ipa,會看到 framework在單獨的一個資料夾中。我這裡的理解是,Linked Frameworks and Libraries表示連線,動態連線也算連線,所以Embeded Binaries選項卡中中的專案也會出現在Linked Frameworks and Libraries選項卡中。

另外,如果framework中包含的2進位制檔案是個靜態庫,而我們把這個framework當成一個包含動態庫的framework,新增到了Embeded Binaries選項卡中,那麼程式無法通過編譯,會報錯的。

如何看一個framework中的2進位制檔案是一個靜態庫還是一個動態庫呢?使用file 命令。

見下面的截圖,一個動態庫,一個靜態庫:

看到這裡可以明白了,framework就是把以前的.a 和 .so 檔案又包裝了一層目錄,加入了些其他必要的檔案,比如以前用.a時需要單獨引入的一系列.h檔案,這樣看起來更規範一些!

就是說,如果引入了第三方的動態庫,這個包含動態庫的framework就需要新增到 ipa包中,載入的時機看引數,如果是required,那麼程式載入時就載入,如果是optional,那麼是使用到時,才載入。如果引入了靜態庫,這個.a的連結也看引數?不都是需要把部分2進位制程式碼連結入目標檔案嗎?有什麼區別嗎?不太明白。我覺得當使用靜態庫時,這個required 和 optional就沒什麼用了。

又遇到了一個問題,用embeded 方式加入 lumberjack framework 後,執行時總出如下警告:

objc[2738]: Class DDTTYLogger is implemented in both /private/var/containers/Bundle/Application/621285FC-47C0-4631-A664-2764018435AD/Gamification.app/Frameworks/CocoaLumberjack.framework/CocoaLumberjack and /var/containers/Bundle/Application/621285FC-47C0-4631-A664-2764018435AD/Gamification.app/Gamification. One of the two will be used. Which one is undefined.

我搜索了工程原始碼,沒有發現其他定義這個類的地方,之後,為了測試,我刪掉了 lumberjack framework ,直接加入了lumberjack.a 進行編譯,這次直接報錯了!這次錯誤就寫的很明白了,原來是工程引入的另一個.a中已經包括了lumberjack的原始碼,我又沒有這個.a的原始碼,所以在工程中就搜尋不到另一個定義。

這也是解決這種類似問題的小技巧吧。

相關推薦

iOS 引入framework常見問題原理

今天在引入第三方framework時,我按照以前的方法,把framework加入到了下圖的地方: 預設是required的,之後程式就crash了,報錯dyld: Library not loaded,之後我把required 改成了optional,這次不crash了,但是執行時出錯,庫中的物件無法例項

IOS 靜態庫的.framework制作

https works select 其它 開源庫 sta cat neo working 什麽是庫? 庫是程序代碼的集合,是共享程序代碼的一種方式 根據源代碼的公開情況,庫可以分為2種類型 開源庫 公開源代碼,能看到具體實現 比如SDWebImage、AFNetwor

ios 打包framework 合併真機模擬器framework

前言 如果想將自己開發的控制元件、程式碼與別人分享,首先我們可以直接提供原始碼檔案。但是,有時候我們並不想別人看到我們程式碼的實現,而這些實現我們可能並不想開源出來。別人也不想將我們寫的程式碼都拖到專案中,他們只是需要一種簡單的方法來編譯你的程式碼,使得你的程式碼易使用,並且在多個工程中易複

iOS開發 .framework的Optional(弱引用)Required(強引用)區別

首先,參考文件:https://blog.stackmob.com/2013/03/objective-c-tip-of-the-month-optional-frameworks/ 強引用(Required)的framework是一定會被載入到記憶體的,但是弱引用(Optional)的framework只

iOS "Warning" No such file or directory詳解、解決方案原理

最近用XCode做了一個靜態庫,在自己電腦上別的App project中編譯使用沒有任何問題,但是傳給別的同事使用在編譯的時候就會出現類似於下面警告。 warning: (i386) /UsersLibrary/Developer/Xcode/DerivedData/ProjectName-ebyadedaa

iOS開發】SELSelector 原理小結

一 、Selector(選擇器)簡介 選擇器是用來選擇一個方法來為一個物件 執行的名稱,或是在編譯原始碼時替換該名稱的 唯一識別符號的名稱。一個選擇器本身不做任何事情。它簡單地識別了一種方法。唯一使選擇器的方法名稱不同於普通字串,編譯器確保選擇器是獨特的。

IOS開發-CocoaPods安裝使用教程及常見錯誤

CocoaPods是iOS最常用的第三方類庫管理工具,絕大部分有名的開源類庫都支援CocoaPods。所以,作為iOS程式設計師,掌握CocoaPods的使用是必備技能。 下面我們就來講一下CocoaPods的安裝流程。 第一步:安裝cocoapods sudo gem

iOS快速開發框架Bee-Framework應用解析(二) --- Bee framework架構概覽

        在第二部分裡,分享一下Bee Framework架構的看法。如果您下載了Bee Framework, 在/document/developer_manual.pdf有Bee的開發手冊。手冊裡有典型的教程,也有對架構的講解。本文試圖融入個人的理解,解答以下問

iOSFramework靜態庫的建立使用遇到的那些坑 韓俊強的部落格

前言網上關於Framework製作的教程數不勝數,然而都過於陳舊,最新的也是使用Xcode7的教程,而且有些設定也只給出步驟,並沒有給出原因,而且按照有些教程製作出的framework還有些問題,所以我

iOS製作framework以及引入到工程

Framework常識 蘋果平臺的連結庫除了靜態庫 .a 和 動態庫.dylib 之外,Mac OS/iOS 平臺還可以使用 Framework。Framework 實際上是一種打包方式,將庫的二進位制檔案,標頭檔案和有關的資原始檔打包到一起,方便管理

Rxlifecycle的引入原理說明

一.背景 在專案中使用Retrofit+Rxjava的過程中,如果程式碼編寫思量不夠就會引入記憶體洩漏。對記憶體的解決方案目前存在三種,第一種是在適當的時候解除對網路請求的訂閱;第二種是採用RxlifeCycle;第三種是採用AutoDisPose。二.Retrofi

iOS 4 多工後臺執行原理

可能很多開發者對 iOS4 的多工和程式後臺執行原理還不是很瞭解,Dr. Touch部落格繪製的這張流程圖深入淺出的揭示了一個 iPhone 應用在 iOS4 中執行的全過程,既全面嚴謹又簡單易懂,推薦大家抽空看一下。您也可以下載 PDF 大圖在本地檢視

iOS快速開發框架Bee-Framework應用解析(一) --- 為什麼使用Bee framework

        去年夏天,兼職參與了一個創業專案iOS部分的開發。可能是iOS剛入門的原因吧,對蘋果原生的開發方式有以下的不好的感覺:         巨型ViewController, 由於delegate和data source的存在,讓view controller

iOS 獲取導航欄狀態欄的高度

bsp statusbar pan frame bar gin cgrect tom uia CGRect rect = [[UIApplication sharedApplication] statusBarFrame]; 狀態欄的高度: float status

IOS http(上傳下載)

fig pla nil style span atof port use userinfo HttpTool.h #import <Foundation/Foundation.h> typedef void (^HttpToolProgressBlock

iOS-swift-函數閉包

let sda rem blog ios div cond 一個 功能 一、函數 關鍵字:func 參數列表用 , 分割 使用 -> 分割參數和返回值 1 func greet(person: String, day: String)

iOS-swift-枚舉結構體

枚舉 queen def esc cas int 最大 log style 1.枚舉 使用關鍵字 enum 創 建枚舉。 枚舉默認起始值為 0,可以自定義起始值。 在枚舉中可以定義方法,和類中定義的一樣。 使用關鍵字 rawValue 訪問當

iOS中xib與storyboard原理,與Android界面布局的異同

ast int mvc color ron rect sdn -m control 用文本標記語言來進行布局,用的最多的應該是HTML語言。HTML能夠理解為有一組特殊標記的XML語言。 一、iOS中xib與storyboard顯示原理 在iOS中基

PRINCE2認證的優勢原理

cert 幫助 以及 env strong 容易 工具 個人 pri PRINCE2(PRINCE2認證 PRINCE2考試 )不僅是英國事實上所有類型項目的標準程序,現在已迅速發展成為國際標準。對於什麽是PRINCE2,PRINCE2的優勢和原理你了解多少呢?本文將重點介

iOS發布證書描述文件申請

需要 如果 蘋果 idt onload 證書 afa store 下載 iOS發布證書 用於發布到App Store,只有用iOS發布證書打包的IPA才能上架到蘋果應用市場。 如果要真機調試請看發布iOS調試證書的創建教程。 iOS真機調試介紹 一、創建iOS發布證書 i