@import vs#import-iOS 7




objective-c ios7 (4)

你可以在Objective-C學習Cocoa的書中找到很好的答案(ISBN:978-1-491-90139-7)

模塊是將文件和庫鏈接到項目中的新手段。 為了理解模塊是如何工作的以及它們有什麼好處,重新回顧Objective-C和#import語句的歷史非常重要當您想要包含要使用的文件時,您通常會看到如下代碼:

#import "someFile.h"

或者在框架的情況下:

#import <SomeLibrary/SomeFile.h>

由於Objective-C是C編程語言的超集,#import語句對C的#include語句進行了細微的改進。 #include語句非常簡單; 它會在編譯過程中將包含文件中發現的所有內容複製到您的代碼中。 這有時會導致重大問題。 例如,假設你有兩個頭文件: SomeFileA.hSomeFileB.h ; SomeFileA.h包含SomeFileB.hSomeFileB.h包含SomeFileA.h 。 這會產生一個循環,並可能使coimpiler感到困惑。 為了解決這個問題,C程序員必須防範這種事件的發生。

使用#import ,您不必擔心此問題或編寫標題警衛來避免此問題。 然而, #import仍然只是一個優化的複制和粘貼操作,導致其他一些較小但仍非常危險的問題(例如,包含的文件覆蓋了您在自己的代碼中其他地方聲明的內容)的編譯時間很慢。

模塊試圖解決這個問題。 它們不再是對源代碼的複制和粘貼,而是包含文件的序列化表示,只有在需要時才可以將它們導入到源代碼中。 通過使用模塊,代碼通常會更快地編譯,並且比使用#include或#import更安全。

回到之前導入框架的例子:

#import <SomeLibrary/SomeFile.h>

要將該庫作為模塊導入,代碼將更改為:

@import SomeLibrary;

這有助於Xcode將SomeLibrary框架自動鏈接到項目中。 模塊還允許您只將真正需要的組件包含到項目中。 例如,如果你想在AwesomeLibrary框架中使用AwesomeObject組件,通常你將不得不導入所有東西來使用它。 但是,使用模塊時,只需導入要使用的特定對象即可:

@import AwesomeLibrary.AwesomeObject;

對於在Xcode 5中製作的所有新項目,默認情況下啟用模塊。 如果您想在較舊的項目中使用模塊(而且您確實應該),則必須在項目的構建設置中啟用它們。 一旦你這樣做了,你可以在你的代碼中同時使用#import@import語句,而不用擔心。

我正在玩弄一些新的iOS 7功能,並且使用WWDC視頻“在iOS上實現使用UI”中討論的一些圖像效果。 為了在會話的源代碼中產生模糊效果, UIImage通過導入UIKit的類來擴展,如下所示:

@import UIKit;

我想我在另一個會話視頻中看到了一些關於此的內容,但我無法找到它。 我正在尋找任何有關何時使用此功能的背景信息。 它只能用於Apple框架嗎? 使用此編譯器指令的好處是否足以讓我回去更新舊代碼?


使用模塊有幾個好處。 除非創建模塊映射,否則只能在Apple的框架中使用它。 在添加到.pch文件時, .pch有點類似於預編譯頭文件,這是一種調整應用程序編譯過程的方式。 另外,您不必以舊的方式添加庫,使用@import實際上更快更高效。 如果你仍然在尋找一個很好的參考,我會強烈建議你閱讀這篇文章



這是一個稱為模塊或“語義導入”的新功能。 有關會議205404WWDC 2013視頻中有更多信息。 這是預編譯頭文件的更好實現。 您可以將模塊與iOS 7和Mavericks中的任何系統框架一起使用。 模塊是框架可執行文件和頭文件的封裝,並被吹捧為比#import更安全和更高效。

使用@import一大優點是, 您不需要在項目設置中添加框架,它會自動完成 。 這意味著您可以跳過單擊加號按鈕並蒐索框架(金色工具箱)的步驟,然後將其移至“框架”組。 它可以節省許多開發人員的神秘“鏈接器錯誤”消息。

您實際上並不需要使用@import關鍵字。 如果您選擇使用模塊,則所有#import#include指令都將自動映射為使用@import 。 這意味著您不必更改源代碼(或從其他位置下載的庫的源代碼)。 假設使用模塊也會提高構建性能,尤其是如果您沒有很好地使用PCH,或者您的項目有許多小型源文件。

模塊是為大多數Apple框架(UIKit,MapKit,GameKit等)預先構建的。 您可以將它們與您自己創建的框架一起使用:如果您在Xcode中創建Swift框架,它們會自動創建,並且您可以手動為任何Apple或第三方庫自行創建一個“.modulemap”文件。

您可以使用代碼完成來查看可用框架的列表:

在Xcode 5的新項目中默認啟用模塊 。 要在較舊的項目中啟用它們,請進入項目構建設置,搜索“模塊”並將“啟用模塊”設置為“是”。 “鏈接框架”也應該是“YES”:

你必須使用Xcode 5和iOS 7或Mavericks SDK,但你仍然可以發布適用於較老的操作系統(比如iOS 4.3或其他)。 模塊不會改變您的代碼的構建方式或任何源代碼。

來自WWDC幻燈片:

  • 導入框架的完整語義描述
  • 不需要解析標題
  • 導入框架界面的更好方法
  • 加載二進製表示
  • 比預編譯頭更靈活
  • 免受本地宏定義的影響(例如#define readonly 0x01
  • 默認為新項目啟用

要明確使用模塊:

@import Cocoa;替換#import <Cocoa/Cocoa.h> @import Cocoa;

你也可以用這個表示法只導入一個頭文件:

@import iAd.ADBannerView;

Xcode中的子模塊自動完成。





ios7