每當(dāng)新創(chuàng)建一個(gè)新的iOS項(xiàng)目,系統(tǒng)會(huì)默認(rèn)幫我們創(chuàng)建一些文件,下面就來(lái)扒一扒這些常見(jiàn)文件都是干什么的。
有過(guò)iOS項(xiàng)目開(kāi)發(fā)經(jīng)驗(yàn)的人都知道:Xcode 6 以后版本的系統(tǒng)生成文件和之前有很大變化,系統(tǒng)取消了一些默認(rèn)生成的文件,這里主要來(lái)講Xcode 6 前后的區(qū)別,以便更好的了解這些系統(tǒng)文件。
如圖分別為Xcode 6 前后版本生成的項(xiàng)目文件對(duì)比:

透過(guò)對(duì)比可發(fā)現(xiàn)Xcode 5/6 生成的項(xiàng)目有如下區(qū)別:
- Xcode 6 之前有 Frameworks文件夾【之后取消了】
- Xcode 6 之前根據(jù)項(xiàng)目名稱(chēng)命名【之后直接以 info命名】
- Xcode 6 之前項(xiàng)目自動(dòng)生成一個(gè)以項(xiàng)目名命名的PCH文件【之后直接取消了】
下面分別介紹這幾個(gè)文件
1. info.plist
- 在Xcode 6 之前以項(xiàng)目名稱(chēng)命名
- Xcode 6 之后直接叫 info.plist
info.plist是iOS項(xiàng)目的項(xiàng)目配置文件,它里面配置了項(xiàng)目的基本信息:

從上圖可以看到info.plist文件實(shí)際上是一個(gè) Dictionary , 內(nèi)部是根據(jù)不同的 key 來(lái)設(shè)置對(duì)應(yīng)的屬性。
我們可以修改對(duì)應(yīng)的key對(duì)應(yīng)的屬性值來(lái)達(dá)到修改項(xiàng)目配置信息的目的。
注意:
info.plist 展示成這樣是由Xcode解析過(guò)的。他真實(shí)的key并不是我們看到的那個(gè)。真實(shí)的key 我們可以通過(guò)進(jìn)入源代碼看:

// 通過(guò)代碼獲取對(duì)應(yīng) key 的值
NSString *currentVersion = [[NSBundle mainBundle].infoDictionary valueForKey:@"CFBundleShortVersionString"];
NSLog(@"當(dāng)前版本號(hào) :%@" ,currentVersion);
2. pch文件
PCH文件是Xcode項(xiàng)目中的預(yù)編譯文件。其中的內(nèi)容在項(xiàng)目編譯之初最先編譯,編譯完成之后整個(gè)項(xiàng)目共享。
PCH作用如下:
- 存放一些公用的宏
- 防止一些公用頭文件
- 自定義LOG
PCH文件在Xcode 6 之后的使用
由于Xcode 6 之后取消了pch文件,說(shuō)明Apple不在推薦使用。如果項(xiàng)目需要我們可以通過(guò)自己創(chuàng)建PCH文件來(lái)使用,步驟如下:
-
創(chuàng)建新文件 -> Other -> PCH File
Snip20170412_5.png -
配置預(yù)編譯文件及相應(yīng)路徑: Build Settings -> Prefix 修改配置信息:
Snip20170412_6.png 自定義LOG
// 宏里面可變參數(shù):...
// 函數(shù)中可變參數(shù): __VA_ARGS__
#ifdef DEBUG // 調(diào)試階段
#define XYLog(...) NSLog(__VA_ARGS__)
#else // 發(fā)布階段
#define XYLog(...)
#endif
- PCH規(guī)范,區(qū)分項(xiàng)目文件
- PCH 是項(xiàng)目中的預(yù)編譯文件,相當(dāng)于是把文件中的內(nèi)容復(fù)到整個(gè)項(xiàng)目中,為防止項(xiàng)目使用C語(yǔ)言進(jìn)行混編,C語(yǔ)言的文件中不支持OC特性,我們應(yīng)該區(qū)分開(kāi),在pch中添加如下宏
#ifdef __OBJC__ /* OBJC */
中間添加對(duì)應(yīng)代碼
#endif /* OBJC */
為防止PCH文件的重復(fù)引入,應(yīng)該添加如下宏
#ifndef PrefixHeader_pch /* PrefixHeader_pch */
#define PrefixHeader_pch
中間添加對(duì)應(yīng)代碼
#endif /* PrefixHeader_pch */
最終如下:

3. Frameworks文件夾
Frameworks是系統(tǒng)默認(rèn)引入的框架。
- 在Xcode 6 之前需要開(kāi)發(fā)者手動(dòng)導(dǎo)入框架,F(xiàn)rameworks文件夾中的是最常用的 Foundation、UIKit等基礎(chǔ)框架,當(dāng)開(kāi)發(fā)者需要導(dǎo)入其他框架的時(shí)候也會(huì)導(dǎo)入到里面
-
Xcode 6 之后系統(tǒng)不再生成此文件夾,項(xiàng)目中用到的一些基礎(chǔ)框架系統(tǒng)會(huì)默認(rèn)在用的時(shí)候加載。當(dāng)開(kāi)發(fā)者需要導(dǎo)入其他框架的時(shí)候也會(huì)生成Frameworks文件夾并導(dǎo)入到里面
Snip20170412_1.png
4. Assests.xcassests 和 LaunchScreen.storyboard
兩者分別用于 app 部署時(shí)候設(shè)置 AppIcon 和 啟動(dòng)圖。
- 在Xcode 6 之前設(shè)置 AppIcon 默認(rèn)需要在 s.xcassests -> AppIcon 中設(shè)置。同樣啟動(dòng)圖也是在 Assests.xcassests 中自己生成一個(gè) Assest 設(shè)置啟動(dòng)圖。
- Xcode 6 之后蘋(píng)果推出 LaunchScreen.storyboard 來(lái)用來(lái)更方便的設(shè)置啟動(dòng)圖。
兩者區(qū)別和各種利弊:
- 優(yōu)先級(jí) : LaunchScreen > LaunchImage(Assest)
如果在 Xcode 中設(shè)置了使用LaunchImage不起作用
1. command + shift + k 清理緩存
2. 直接刪除程序,重新運(yùn)行
3. 如果使用launchImage 必須讓美工提供各種合適尺寸的啟動(dòng)圖片
- LaunchScreen 在 Xcode 6 之后推出。它的優(yōu)勢(shì):
1. 自動(dòng)識(shí)別當(dāng)前真機(jī)或者模擬器的尺寸,
2. 只要讓美工提供一張可以拉伸的圖片即可
3. 可以展示更過(guò)的內(nèi)容,和編輯一個(gè)StoryBoard頁(yè)面一樣
4. LaunchScreen底層實(shí)現(xiàn)是把 LaunchScreen截屏,生成一張圖片作為啟動(dòng)圖使用


