个人浅见:简析Xcode中一个项目的目录结构

讲得可能比较啰嗦,各位看官遇到已经知道的知识点就请直接跳过,看到错误的地方请指正。

一般情况下,一个项目,在Xcode中表现为以下几个部分:

1.我们新建的项目,在Xcode中叫Project。Project也是iOS代码分层中最大的一个概念。

2.第二层就是Target,仅次于Project的一个层次,一个Project可以包含很多Targets。正常的新建一个Project时,Xcode会自动生成两个Project:一个是放App主代码的Target,另一个是Tests的Target(一个用于做单元测试的Target)。

首先声明一下,各个Target下面的类是不互通的,如上图的话,Demo这个Target中是#import不到DemoTests这个Target中的类的。我们可以简单的把Target比喻成一个又一个的纸箱,他们里面放着各自的类,不同Target下时根本不知道其它Target下面有什么类可供自己使用的。大多数情况下,我们只用到了主Target,就是那个跟我们的Project同名的那个Target。我们在项目中“New File…”新建出来的类都是默认归在我们的主Target下的。

那么怎么让一个类在多个Target中使用呢?直接上图:

​我们新建的类,它的Target Membership表现为.h一个ship都没有,.m有一个跟主Target的ship,此时,我们可以在主Target的任意地方#import这个类,然后就可以肆意的调用它。由此,可见想要再某个Target肆意的调用一个类,它的.m文件需要跟这个Target有个ship关系。所以,假如当我们想要在DemoTests这个Target中#import并调用DemoTest这个类的话,我们需要手动帮他们之间建立ship,然后就一切如常,直接上图:

然而现实开发过程中,我们一般都是想要用到那个类了,就在当前类的头部直接#import我们想要的类,而忽略当前Target是否可以直接#import这个类,然后就导致了一些奇葩的错误,自己还是怎么看都看不出来,怎么看都觉得代码没有问题,心里第一想法就是Xcode又犯抽了,但当我们试过Clean、重启Xcode、重启电脑…等等方法后,错误一如既往的存在,那一刻心中肯定是千万只草泥马在奔腾,同时也问候了N次Xcode的祖宗、甚至苹果所有官方人员的祖宗。老实说这个错误,是一个很难想到的点,很多时候我们很难想到,所以我们只能活在对自我的煎熬中。

对于类似的这种错误:明明#import了某个类,但编译一直出错。我个人的检查步骤,如下:

a.  Clean代码,再次Build;

b.  a解决不了问题,重启Xcode;

c.  上面两个都试了还是解决不了,那就去当前类所在的Target的Build Phases下,检查Complie Sources列表,有没有自己想要#import的类的.m文件。如果幸运的话,你会发现没有你想要的.m文件,那么把它加上就好了;

d.  试了以上三个方法还是搞不定,那我只能恭喜你:你心中的草原,水草很是肥沃,那千万只草泥马决定多留一段时间,养个秋膘,好过冬。

PS: 以前一般情况下我们也用不到多个Target,很多人开发基本就只用到了主Target,连TestsTarget基本上都不会用到,所有的测试都是自己手工或是完全依赖测试团队的测试。

但当iOS8发布后,Target就不在是一个无关紧要的知识,因为Share Extension、Today Widget,都是一个成功App必不可少的,而他们正式通过Target的形式来实现的。甚至之后的Watch OS,都是通过Target来实现的。当Target越来越多时,上面的错误发生的频率也就在一定程度上上升了。

3.第三层就是Group,其实Group也不能算一个严格意义上的分层。因为对于最后的代码编译来说,Group是没有意义的。我对Group的理解更多的是:它是一个分快整理类的虚拟盒子,看似把这些类归类在了这个Group下,但其实对于整个Target来说,其实Group是完全敞开的,Group之间不存在任何壁障,不同Group之间的类完全可以互相引用并使用。

4.Folder,一个特殊的分层。简单的理解,Folder是跟一个具有跟Group类似功能的东西,它主要的作用就是分块收集类。他们之间最直观的表现就两点:1.在项目文件目录中,Folder的图标的蓝色,Group则是黄色的;2.在不同文件夹中的类想要引用的话,#import时需要指明类的Folder路径。

​Group和Folder在项目实际文件目录中的位置:

它们都是我直接在Demo这个文件加下,直接通过右键“新建文件夹”的方式新建的。那为什么把加到Xcode中又会出现两种不同的产物呢?

OK,通常我们的开发过程中会用到很多三方的开源库(因为他们可以帮助我们省去很多自己写轮子的时间,而且有些开源库确实写得很酷),这种时候,我都是下载到了开源库的代码,它一般都都放在某个文件夹下面,然后我们会做一个事情,把文件夹拖到我们的(主)Target中来,这个时候Xcode需要我们做以下选择:1.Create groups(把这个文件下面所有的文件夹目录都自动生成Group并让他们一一对应);2.Create folder references(把所有文件目录原封不动的拷进来,他们就是一个包着一个的Folder)。个人建议,如非必要,选择第一种“Create groups”。

猜你喜欢

转载自blog.csdn.net/huangyimo/article/details/85251786
今日推荐