徹底搞懂import "" 和 import <>

今天打開Xcode看到import的時候,突然想起來好像除了在剛出來工作面試iOS的時候背過它們的區別外,后來就再也沒有深入了解過這兩個究竟是什么作用,以致于到現在連作用區別都一時間說不上來,實在慚愧。今天還是來徹底研究一番。

一般情況下

我們新建一個項目,再創建一個類文件比如叫FooView,此時我們要在其它地方用到FooView的時候,我們一般這樣

#import "FooView"

當我使用cocoapod安裝第三方庫,比如安裝了Masonry,那么在用到Masonry的時候,一般我都會

#import <Masonry.h>

為什么不用 "",因為我發現用""編譯器并不會給出提示,所以我一直以為只能用<>,但是在我做過的幾個項目中,我其實并沒有用到 <>,而是一直都用的 "",曾經也很奇怪為什么會不一樣,但之前也只是想想,可能是項目設置里面加了什么東西,也沒有仔細深入了解。(PS:這種精神還是不可取的)

所以就會有這樣一個思維:正常情況下,自己新建的文件用"",而通過cocoapod安裝或者引用系統庫文件,用<>

在Stack Overflow上有一個回答較高的解釋:

the quoted form is for “local” includes of files (you need to specify the relative path from the current file, e.g. #include “headers/my_header.h”), while the angle-bracket form is for “global” includes — those found somewhere on the include path passed to the compiler。
大概意思就是雙引號用于引用本地文件,需要指定相對路徑,尖括號用于全局引用,路徑由編譯器提供。

所以當我們用<>引用我們新建的文件的時候,就會有這樣一個提示:

'FooView.h' file not found with <angled> include; use "quotes" instead

user header map

Enable the use of Header Maps, which provide the compiler with a mapping from textual header names to their locations, bypassing the normal compiler header search path mechanisms. This allows source code to include headers from various locations in the file system without needing to update the header search path build settings。

在Xcode項目 - Build Settings 下搜索:search path

2020-03-05-01.png

我們會看到有一個Use Header Maps開關,默認是打開的。這個意思是:開啟這個開關后,在本地會根據當前目錄生成一份文件名和相對路徑的映射,依靠這個映射,我們可以直接import工程里的文件,不需要依靠header search path。
我們在管理項目的時候,一般都會把文件放在各個模塊下面,模塊以各個文件夾區分,在Xcode中創建文件夾會有兩種方式,一種是虛擬文件夾(文件還是在項目根目錄下),一種是真實文件夾。我之前一直覺得他們就是文件在不在一起的區別,當我關掉Use Header Maps這個選項的時候,這兩種文件夾在這里又表現出了不一致。

我一開始是用New Group With Folder創建的真實文件夾


2020-03-05-02.png

EventViewController是BaseViewController的子類,在頭文件中引用了BaseViewController。
當我關掉Use Headers Maps選項的時候,就會報以下錯誤:


2020-03-05-03.png

相對路徑找不到BaseViewController,這時候EventViewController是在Event文件夾下,BaseViewController是在Base文件夾下,由于關閉了Header Maps,所以無法直接引用。

但是當我用虛擬文件夾管理文件的時候,由于他們都是在根目錄下,所以通過相對路徑引用是完全沒有問題的,即使關閉了Use Headers Maps選項。

該如何解決?

這時候我們就涉及到Header Search PathsUser Header Search Paths。兩者都是提供search path,區別在于一個指明是用戶的。并且如果編譯器不支持user headers概念,會從header search paths中去尋找。并且看上面有一個Always Search User Paths,但是已經被Deprecated。查閱資料知道

如果開啟,<> 和 “” 都可以引用,關閉的話,user headers 只能通過””引用。

我們現在要讓編譯器知道這個文件在哪里,所以要在search paths里面添加引用文件所在的文件夾。


2020-03-05-04.png

在Header Search Paths里添加的話,無論import “” 還是 import <>都是沒有問題的,在User Header Search Paths里添加,只能使用import “”

解答上面cocopad安裝第三方庫引用的疑問

看下面的三種方式

#import "Masonry.h"
#import <Masonry.h>
#import "Masonry/Masonry.h"

思考一下這三種方式是否都正確?
.
.
.
答案是:都正確。

之前一直困惑用哪種方式,又好像哪種方式都正確。這次直接看 search paths下面,發現


2020-03-05-05.png

cocopod在install的時候,會將第三方庫的framework路徑添加到Header Search Paths下,所以我們可以直接import,也可以import它的模塊下的文件

總結

如果按照Xcode默認配置的話,自己新建的文件直接import “”使用,cocoapod安裝的第三方庫使用import “”、import <>都可以使用。如果關閉Use Header Maps,文件不在根目錄下的話,需要手動添加路徑到search paths中,添加到User Header Search Paths只能通過import ”“使用,添加到Header Search Paths兩種方式都可以。

來自 https://leejnull.github.io/2020/03/05/2020-03-05-01/
參考:關于Objective-C中的import - 掘金

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容