我正在玩弄一些新的iOS 7功能,並使用WWDC視頻「在iOS上實現使用UI」中討論的一些圖像效果。爲了生產用於會話的源代碼中的模糊效果,UIImage
經其中進口的UIKit像這樣一個分類的擴展:@import vs #import - iOS 7
@import UIKit;
我覺得我看到了一些關於這在另一個會話視頻,但我無法找到它。我正在尋找任何有關何時使用此功能的背景信息。它只能用於Apple框架嗎?使用此編譯器指令的好處是否足以讓我回去更新舊代碼?
我正在玩弄一些新的iOS 7功能,並使用WWDC視頻「在iOS上實現使用UI」中討論的一些圖像效果。爲了生產用於會話的源代碼中的模糊效果,UIImage
經其中進口的UIKit像這樣一個分類的擴展:@import vs #import - iOS 7
@import UIKit;
我覺得我看到了一些關於這在另一個會話視頻,但我無法找到它。我正在尋找任何有關何時使用此功能的背景信息。它只能用於Apple框架嗎?使用此編譯器指令的好處是否足以讓我回去更新舊代碼?
這是一個新功能,稱爲模塊或「語義導入」。有關Session 205和404的WWDC 2013視頻中有更多信息。這是預編譯頭文件的更好實現。 您可以將模塊用於iOS 7和Mavericks中的任何系統框架。模塊是框架可執行文件和它的頭文件的封裝,並被吹捧爲比#import
更安全和更高效。
使用@import
的一大優勢是您不需要在項目設置中添加框架,它會自動完成。這意味着您可以跳過單擊加號按鈕並搜索框架(金色工具箱)的步驟,然後將其移至「框架」組。它可以節省許多開發人員的神祕「鏈接器錯誤」消息。
實際上您並不需要使用@import
關鍵字。如果您選擇使用模塊,則所有#import
和#include
指令將自動映射爲使用@import
。這意味着您不必更改源代碼(或從其他位置下載的庫的源代碼)。假設使用模塊也會提高構建性能,尤其是如果您沒有很好地使用PCH,或者您的項目有許多小型源文件。
模塊是爲大多數Apple框架(UIKit,MapKit,GameKit等)預先構建的。您可以將它們與您自己創建的框架一起使用:如果您在Xcode中創建Swift框架,它們會自動創建,並且您可以手動爲any Apple or 3rd-party library自己創建一個「.modulemap」文件。
可以使用代碼完成以查看可用的框架的列表:
模塊默認情況下,在新的項目在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中的子模塊自動完成。
@DaveDeLong&Klaas:謝謝!我不得不承認,當我第一次回答這個問題時,我對模塊一無所知。我去看了會話404以瞭解它。 Doug Gregor(LLVM傢伙)給出的演示非常精彩。還有一個C++模塊對話,在這裏解釋了這些優勢:http://www.youtube.com/watch?v=4Xo9iH5VLQ0 –
@ nevan--感謝您的回答。我只想補充說,模塊目前還不支持第三方和你自己的框架。 – jamdaddy25
你可以使用這個爲你自己的課程? – cfischer
它目前只適用於內置的系統框架。如果您使用#import
像蘋果一樣仍然在應用程序委託中導入UIKit
框架,它將被替換(如果模塊處於打開狀態並且它被識別爲系統框架),編譯器會將其重新映射爲模塊導入,而不是導入標題無論如何。 因此,離開#import
將與其儘可能轉換爲模塊導入相同
使用模塊有幾個好處。除非創建模塊映射,否則只能在Apple的框架中使用它。當添加到.pch
文件時,@import
與預編譯頭文件有點相似,這是調整應用編譯過程的一種方式。此外,您不必以舊的方式添加庫,實際上使用@import
的速度更快,效率更高。如果你仍然期待一個很好的參考,我會強烈推薦你閱讀this article。
很高興回答您可以在本書的學習可可找到的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.h
和SomeFileB.h
;包括SomeFileB.h
和SomeFileB.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
聲明而不用擔心。
在我的項目(Xcode 6)中,我沒有選擇啓用Xcode 4以啓用模塊。我可以手動添加它嗎? –
構建目標是iOS 6,我認爲這是問題 –
看來,因爲的XCode 7.xa很多警告的是走出來CLANG_ENABLE_MODULES
啓用時鐺模塊在Lots of warnings when building with Xcode 7 with 3rd party libraries
是的,我也有這個問題,但將其設置爲NO會刪除所有警告。當我這樣做時會有副作用嗎? – satheeshwaran
http://stackoverflow.com/questions/29701647/use-看看當模塊被禁用進口時 –
http://stackoverflow.com/questions/29701647/use-of-import-when-modules-are-disabled –