標籤:

理解Objective-C的Modules

前世今生

Objective-C modules的思想是由LLVM引入的;他們作為作為傳統#import & #include機制的一個解決辦法。

自動引入modules,modules開始悄悄的進入xcode開發生態中,隨著swift引入變的更加流行。CocoaPods會為你自動處理module map文件;這是你為什麼可以直接使用@import。

關於Modules背後的原理

Framework 創建Modules

  1. Xcode創建framework Modules極其簡單:因為你在Xcode中創建Framework的時候,已經為你在build settings中設置Defines Module為YES

在framework中modules是被默認設置為yes的

創建Framework的時候,Xcode默認都是開啟modules的

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:

  1. 你需要手動創建modulemap文件:

創建Static Library時,Defines Module默認是關閉的,你需要手動打開

2. 需要保證module.modulemap添加到Copy Files中:

添加modulemap到copy file中

3. 在你可以使用mdulemap之前,你還需要告訴Xcode modulemap的路徑:在build setting的Module Map File中設置路徑,比如:$(SRCROOT)/StaticLibraryModule/module.modulemap

技巧:可以用xcconfig進行配置你的build setting:

使用xcconfig進行配置build setting

Umbrella Header

在Static Library中,我們需要創建一個Umbrella 頭文件,然後將我們需要對外暴露的頭文件在這個Umbrella中暴露:

  1. 定義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

medium.com/allatoneplac

推薦閱讀:

TAG:iOS |