理解Objective-C的Modules
前世今生
Objective-C modules的思想是由LLVM引入的;他們作為作為傳統#import & #include機制的一個解決辦法。
自動引入modules,modules開始悄悄的進入xcode開發生態中,隨著swift引入變的更加流行。CocoaPods會為你自動處理module map文件;這是你為什麼可以直接使用@import。
關於Modules背後的原理
Framework 創建Modules
- Xcode創建framework Modules極其簡單:因為你在Xcode中創建Framework的時候,已經為你在build settings中設置Defines Module為YES
在framework中modules是被默認設置為yes的
2. 當你build你的framework的時候,Xcode會自動給你生成一個包含umbrella頭文件的module 文件;格式如下:
framework module SwiftFramework {
umbrella header "SwiftFramework.h"
export *
module * { export * }
}
對於自動生成modulemap的framework,你的umbrella文件的名字需要和你的framework名稱相同
Static Library創建Modules
默認情況下,Xcode不會為Static Library創建Modules;為了支持Modules:
- 你需要手動創建modulemap文件:
2. 需要保證module.modulemap添加到Copy Files中:
3. 在你可以使用mdulemap之前,你還需要告訴Xcode modulemap的路徑:在build setting的Module Map File中設置路徑,比如:$(SRCROOT)/StaticLibraryModule/module.modulemap
技巧:可以用xcconfig進行配置你的build setting:
Umbrella Header
在Static Library中,我們需要創建一個Umbrella 頭文件,然後將我們需要對外暴露的頭文件在這個Umbrella中暴露:
- 定義Umbrella 頭文件:
#import <UIKit/UIKit.h>
FOUNDATION_EXPORT double StaticLibraryModuleVersionNumber;
FOUNDATION_EXPORT const unsigned char StaticLibraryModuleVersionString[];
#import "StaticLibraryModelClass.h"
#import "StaticLibraryNetworkingClass.h"
2. 然後更新module map文件:
module StaticLibraryModule {
umbrella header "StaticLibraryModule.h"
export *
}
Submodules
有時候你想將一個Framework進行分析不同的邏輯模塊;如何你只希望引入其中部分文件,直接import整個module非常的糟糕;使用Submodules可以避免這種尷尬:
Example:
module StaticLibraryModule {
export *
// Define a Model module, which include an example model object class.
explicit module Model {
header "StaticLibraryModelClass.h"
}
// Define a Networking module, which include an example networking object class.
// This exports the Model module, meaning that importing the Networking module
// will implicitly import the Model module along with it.
explicit module Networking {
header "StaticLibraryNetworkingClass.h"
export Model
}
}
1. submodules定義使用的explicit
2. ???
引用:
Understanding Objective-C Modules https://medium.com/allatoneplace/challenges-building-a-swift-framework-d882867c97f9
推薦閱讀:
TAG:iOS |