彻底搞懂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阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容