2013-09-22 133 views
394

我正在玩弄一些新的iOS 7功能,並使用WWDC視頻「在iOS上實現使用UI」中討論的一些圖像效果。爲了生產用於會話的源代碼中的模糊效果,UIImage經其中進口的UIKit像這樣一個分類的擴展:@import vs #import - iOS 7

@import UIKit; 

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

+0

http://stackoverflow.com/questions/29701647/use-看看當模塊被禁用進口時 –

+0

http://stackoverflow.com/questions/29701647/use-of-import-when-modules-are-disabled –

回答

798

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

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

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

模塊是爲大多數Apple框架(UIKit,MapKit,GameKit等)預先構建的。您可以將它們與您自己創建的框架一起使用:如果您在Xcode中創建Swift框架,它們會自動創建,並且您可以手動爲any Apple or 3rd-party library自己創建一個「.modulemap」文件。

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

enter image description here

模塊默認情況下,在新的項目在Xcode 5啓用。要在較舊的項目中啓用它們,請進入項目構建設置,搜索「模塊」並將「啓用模塊」設置爲「是」。 「鏈接框架」應該是「YES」太:

你要使用的Xcode 5和iOS的7或小牛SDK,但你仍然可以釋放的舊式OS(說的iOS 4.3或什麼)。 模塊不會改變您的代碼的構建方式或任何源代碼。


從WWDC幻燈片:

  • 進口完整的框架語義描述
  • 不需要解析頭
  • 更好的方式來導入一個框架的接口
  • 加載二進制表示
  • 比預編譯的頭文件更靈活
  • 免受本地宏定義的影響(例如, #define readonly 0x01
  • 默認情況下啓用爲新項目

要明確使用的模塊:

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

您還可以導入只有一個頭與此表示法:

@import iAd.ADBannerView; 

您在Xcode中的子模塊自動完成。

+14

@DaveDeLong&Klaas:謝謝!我不得不承認,當我第一次回答這個問題時,我對模塊一無所知。我去看了會話404以瞭解它。 Doug Gregor(LLVM傢伙)給出的演示非常精彩。還有一個C++模塊對話,在這裏解釋了這些優勢:http://www.youtube.com/watch?v=4Xo9iH5VLQ0 –

+3

@ nevan--感謝您的回答。我只想補充說,模塊目前還不支持第三方和你自己的框架。 – jamdaddy25

+0

你可以使用這個爲你自己的課程? – cfischer

2

它目前只適用於內置的系統框架。如果您使用#import像蘋果一樣仍然在應用程序委託中導入UIKit框架,它將被替換(如果模塊處於打開狀態並且它被識別爲系統框架),編譯器會將其重新映射爲模塊導入,而不是導入標題無論如何。 因此,離開#import將與其儘可能轉換爲模塊導入相同

1

使用模塊有幾個好處。除非創建模塊映射,否則只能在Apple的框架中使用它。當添加到.pch文件時,@import與預編譯頭文件有點相似,這是調整應用編譯過程的一種方式。此外,您不必以舊的方式添加庫,實際上使用@import的速度更快,效率更高。如果你仍然期待一個很好的參考,我會強烈推薦你閱讀this article

39

很高興回答您可以在本書的學習可可找到的Objective-C(ISBN:978-1-491-90139-7)

模塊是包括和鏈接文件和庫文件到你的項目的一種新手段。爲了理解模塊是如何工作的以及它們有什麼好處,重新回顧Objective-C和#import語句的歷史非常重要 無論何時您想包含要使用的文件,通常都會有一些代碼看起來像這樣:

#import "someFile.h" 

或者在框架的情況下:

#import <SomeLibrary/SomeFile.h> 

由於Objective-C是C語言的超集,將#import語句是在C'S #include聲明未成年細化。 #include語句非常簡單;它會在編譯過程中將包含文件中發現的所有內容複製到您的代碼中。這有時會導致重大問題。例如,假設您有兩個頭文件:SomeFileA.hSomeFileB.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聲明而不用擔心。

+0

在我的項目(Xcode 6)中,我沒有選擇啓用Xcode 4以啓用模塊。我可以手動添加它嗎? –

+0

構建目標是iOS 6,我認爲這是問題 –