iOS开发中与库相关的术语
動態庫 VS 靜態庫
Static frameworks are linked at compile time. Dynamic frameworks are linked at runtime
?
?
?
.framework VS .a
.a?是一個純二進制文件,不能直接拿來使用,需要配合頭文件、資源文件一起使用。在iOS中是最為靜態庫的文件名后綴。
.framework 中除了二進制文件還有資源文件,可以拿來直接使用。
*在不能開發開發靜態庫的時候,.framework =.a+.h+hundle。 而當 Xcode 6 出來以后,我們可以開發動態庫后 .framework = 靜態庫/動態庫 + .h + bundle
?
.tbd VS .dylib & .a
.a 靜態庫的后綴名。
.dylib?動態庫的后綴名。
.tbd Xcode7后我們在導入系統動態庫是,不在有.dylib了,取而代之的是.tbd, 而 .tbd 其實是一個YAML本文文件,描述了需要鏈接的動態庫的信息。主要目的是為了減少app 的下載大小。
?
Embedded VS Linked(??)
Embedded frameworks are placed within an app’s sandbox and are only available to that app. System frameworks are stored at the system-level and are available to all apps.
- OK,前面說了那么多,那么如果我們自己開發了一個動態framework 怎么把它復制到 dyld 的共享緩存 里面呢?
- 一般來說,用正常的方式是不能滴,蘋果也不允許你這么做。(當然不排除一些搞逆向的大神通過一些 hack 手段達到目的)
- 那么,我們應該如何開發并使用我們自己開發的 動態framework 呢?
- 那就是 Embedded Binaries。
- Embedded 的意思是嵌入,但是這個嵌入并不是嵌入 app 可執行文件,而是嵌入 app 的 bundle 文件。當一個 app 通過 Embedded 的方式嵌入一個 app 后,在打包之后解壓 ipa 可以在包內看到一個 framework 的文件夾,下面都是與這個應用相關的動態framework。在 Xcode 可以在這里設置,圖中紅色部分:
- 那么問題又來了,下面的 linded feameworks and libraries 又是什么呢?
- 首先在 linded feameworks and libraries 這個下面我們可以連接系統的動態庫、自己開發的靜態庫、自己開發的動態庫。對于這里的靜態庫而言,會在編譯鏈接階段連接到app可執行文件中,而對這里的動態庫而言,雖然不會鏈接到app可執行文件中,但是會在啟動的時候就去加載這里設置的所有動態庫。(ps.理論上應該是這樣,但是在我實際測試中似乎加載不加載都和這個沒關系。可能我的姿勢不對。?)
- 如果你不想在啟動的時候加載動態庫,可以在 linded feameworks and libraries 刪除,并使用dlopen加載動態庫。(dlopen 不是私有 api。)
?
- (void)dlopenLoad{NSString *documentsPath = [NSString stringWithFormat:@"%@/Documents/Dylib.framework/Dylib",NSHomeDirectory()];[self dlopenLoadDylibWithPath:documentsPath]; }- (void)dlopenLoadDylibWithPath:(NSString *)path {libHandle = NULL;libHandle = dlopen([path cStringUsingEncoding:NSUTF8StringEncoding], RTLD_NOW);if (libHandle == NULL) {char *error = dlerror();NSLog(@"dlopen error: %s", error);} else {NSLog(@"dlopen load framework success.");} }
?
點擊build之后,Xcode做了什么
LD && libtool
ld:用于產生可執行文件
libtool:產生lib的工具
?
Build phases && Build rules && Nuild settings
build phases:主要用來控制從源文件到可執行文件的整個過程,所以應該說是面向源文件的,包括編譯那些文件,一節編譯過程中執行哪些腳本的過程。
build rules:主要是用來控制如何編譯某種類型的源文件,假如說對某種類型的文件進行特定的編譯,同時也會大量的運用一些Xcode中的環境變量。
build settings:主要是對編譯工作的細節進行設定,在這個窗口可以看見大量的設置選項,從編譯到打包再到代碼簽名都有。
?
Mach-O
Mach-O:Match Object文件格式的縮寫,他是一種用于客執行文件、目標代碼、動態庫、內核轉儲的文件格式。作為a.out格式的替代,Mach-O提供了更強的擴展性,并提升了符號表中的信息訪問速度。
?
關于內存五大分區
- BSS段:
BSS段( bss segment )通常是指用來存放程序中未初始化的全局變量和靜態變量 的一塊內存區域。
這里注意一個問題:一般的書上都會說全局變量和靜態變量是會自動初始化的,那么哪來的未初始化的變量呢?變量的初始化可以分為顯示初始化和隱式初始化,全局變量和靜態變量如果程序員自己不初始化的話的確也會被初始化,那就是不管什么類型都初始化為0,這種沒有顯示初始化的就 是我們這里所說的未初始化。既然都是0那么就沒必要把每個0都存儲起來,從而節省磁盤空間,這是BSS的主要作用
BSS是英文Block Started by Symbol的簡稱。BSS段屬于靜態內存分配。 BSS節不包含任何數據,只是簡單的維護開始和結束的地址,即總大小。以便內存區能在運行時分配并被有效地清零。BSS節在應用程序的二進制映象文件中并不存在,即不占用 磁盤空間 而只在運行的時候占用內存空間 ,所以如果全局變量和靜態變量未初始化那么其可執行文件要小很多。
- 數據段(data segment)
通常是指用來存放程序中已經初始化的全局變量和靜態變量的一塊內存區域。數據段屬于靜態內存分配,可以分為只讀數據段和讀寫數據段。字符串常量等,但一般都是放在只讀數據段中。
- 代碼段(code segment/text segment)
通常是指用來存放程序執行代碼的一塊內存區域。這部分區域的大小在程序運行前就已經確定,并且內存區域通常屬于只讀, 某些架構也允許代碼段為可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等,但一般都是放在只讀數據段中 。
- 堆(heap)
堆是用于存放進程運行中被動態分配的內存段,它的大小并不固定,可動態擴張或 縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張); 當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)
?
- 棧 (stack heap)
棧又稱堆棧, 是用戶存放程序臨時創建的局部變量,也就是說我們函數括弧“{}” 中定義的變量(但不包括static聲明的變量,static意味著在數據段中存放變量)。除此以外, 在函數被調用時,其參數也會被壓入發起調用的進程棧中,并且待到調用結束后,函數的返回值 也會被存放回棧中。由于棧的后進先出特點,所以 棧特別方便用來保存/恢復調用現場。從這個意義上講,我們可以把堆棧看成一個寄存、交換臨時數據的內存區。
小 Tips
- 棧區中的變量不需要程序員管理
- 堆區的需要程序員管理
- 在 iOS 中堆區的內存是所有應用程序共享
- 系統使用表級別結構來分配內存空間,所以邏輯地址和物理地址可能不一樣
?
筆記來源:https://github.com/Damonvvong/DevNotes/blob/master/Notes/framework2.md
轉載于:https://www.cnblogs.com/mapanguan/p/9197982.html
總結
以上是生活随笔為你收集整理的iOS开发中与库相关的术语的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Roman to Integer Lee
- 下一篇: java在注解中绑定方法参数的解决方案