談談objc公用庫 ( 公用庫的建立與分發)

2021-07-08 22:24:11 字數 1850 閱讀 3432

一.概述

公用庫本質上就是一些可重用邏輯的集合,是「分而治之」的一種途徑,其出現的形式可以是原始碼亦或是二進位制。

公用庫也需要理清自己的依賴關係,比如依賴系統sdk的哪些庫的哪些介面(決定了公用庫適用的系統版本),依賴哪些第三方的庫。不過你想把乙個東西拿出去給別人用,那你就得想方設法去減少不必要的依賴。

作為乙個公用庫的開發者,提供公用庫給別人使用時,需要站在使用者的角度去思考問題,公用庫的介面以及接入使用的繁簡體現了公用庫作者的職業道德和素養。

二.設計與實現

第一步當然是明確公用庫的目標,要做什麼,不做什麼,一二三四列出來,並在後繼的實現中最大可能地堅持目標原則。

專案的構建也有幾種選擇:

使用xcode的」cocoa touch static library」專案模板新建專案,target為乙個靜態庫

安裝 ios universal framework ,然後在xcode中通過其提供的」static ios framework」專案模板新建專案,其target為framework庫

另外你可以在上面的基礎上,通過cocoapods來管理你自己的公用庫的依賴。

在實現的時候,公用庫自身的原始碼全都放到某個目錄中或者其子目錄中(是指那些可以直接拷貝出去使用的原始碼,不包括自身編譯所依賴的檔案,比如prefix.pch)。

標頭檔案只暴漏那些必須的,在實現庫的時候能夠在實現檔案中進行引入的的則在實現檔案中進行引入,如果在需要暴漏的標頭檔案中引入另乙個標頭檔案,那麼這另乙個標頭檔案也必須要暴漏出來。

另乙個常見的問題便是介面的方法宣告不遵循objc的語言規範,給人以山寨的感覺。還是建議公用庫的實現最好有乙個當前語言的老手帶著做,熟悉當前語言的規範和常用的正規化,比如何時使用delegate,何時使用block。

還有就是在實現的時候盡可能少地引入第三方的依賴,如果確實需要引入,那麼編譯的時候千萬別把公用庫自身依賴的第三方的內容當成自己的一部分,如果你很**,硬要把第三方的內容搞成自己的一部分,那麼你至少得修改這些依賴的相關類的類名,靜態變數名,如果是category,還得修改其方法名。

最後就是你得堅持良好的注釋和文件 ,某個方法 如有特殊的需要注意的點,則需要注釋說明,你還得提供乙個readme檔案,用於描述當前庫的目的,以及各個介面的使用範例。

三.分發與整合

其實在公用庫構建的初期,你就得想好分發的方式。一種好的分發方式可以大大降低公用庫整合使用的成本。

乙個公用庫要給別人用,無非就兩種形式:原始碼或者二進位制格式(額外提供標頭檔案,資源檔案),原始碼的形式,方便使用者進行除錯,二進位制格式則適用於那些不方便公開原始碼的公用庫。

在使用公用庫的時候,xcode都是通過header search path來尋找靜態庫的標頭檔案的,通過framework search path來尋找framework的,當使用cocoapods來管理的時候,這些環境變數的設定都是自動幫你完成的,在其生成的xcconfig檔案中。

四.和庫相關的幾個命令

下面幾個命令都是和二進位制庫相關的,這些二進位制檔案可以叫做物件檔案,在mac或者ios平台中用的都是mach-o(mach object),所以這些命令其實都是讀取或者操作mach object的,你可以通過man來檢視相應的詳情使用者手冊。

nm display name list (symbol table),其實就是把物件檔案中的相關符號標識都列出來

otool

otool,顧名思義就是object tool,比其nm來說,其功能更強大,可以檢視物件檔案的方方面面,比如展示物件檔案的mach header,用到了哪些共享庫(shared libraries),或者資料段內容等。

lipo

create or operate on universal files,此命令主要是幫你檢視或者建立支付多平台的靜態庫的。比如將兩台不同平台的靜態進行合併。

採集程式 1 公用函式庫

模組說明 公用函式庫 包括 dump函式 mysql類 從flea中複製過來,用來輸出變數以除錯 param 任意型別 vars param unknown type label param unknown type return return 無 function dump vars label ...

公用的資料庫表和一些業務表

字典 select from code library where codeno partnertype select from code library where codeno tickettype getitemname bailusetype status getitemname bailu...

靜態庫和動態庫的建立

最近學習了一下靜態庫和動態庫的建立,這裡是我學習後知道的建立方法,在這裡和大家分享以下,如果有不同意見或者更好的建議希望大家批評指正 首先我們先來說以下靜態庫和動態庫 1.靜態庫 首先靜態庫的名字是以.s為字尾來命名的,靜態庫的作用是在函式的呼叫過程中將庫中的所有東西拷貝到目標 所在的檔案中,所以它...