這個(gè)文件是整個(gè)庫(kù)的頭文件。顧名思義,使用時(shí)引入這個(gè)頭文件,就可以使用這個(gè)文件中引入的所有文件。
先看源碼
#import <Foundation/Foundation.h>
//! Project version number for Masonry.
FOUNDATION_EXPORT double MasonryVersionNumber;
//! Project version string for Masonry.
FOUNDATION_EXPORT const unsigned char MasonryVersionString[];
#import "MASUtilities.h"
#import "View+MASAdditions.h"
#import "View+MASShorthandAdditions.h"
#import "ViewController+MASAdditions.h"
#import "NSArray+MASAdditions.h"
#import "NSArray+MASShorthandAdditions.h"
#import "MASConstraint.h"
#import "MASCompositeConstraint.h"
#import "MASViewAttribute.h"
#import "MASViewConstraint.h"
#import "MASConstraintMaker.h"
#import "MASLayoutConstraint.h"
#import "NSLayoutConstraint+MASDebugAdditions.h"
這個(gè)文件代碼很簡(jiǎn)單,但有幾個(gè)點(diǎn)還是要說一下。
1,#import <Foundation/Foundation.h>。這里使用import引入了系統(tǒng)的Foundation框架。如果你還沒有看過這個(gè)框架,建議看一下。里面包含了很多常用的API。記得某個(gè)大神講過:軟件開發(fā)的基礎(chǔ)由三個(gè)部分組成:操作系統(tǒng),網(wǎng)絡(luò)+算法。了解操作系統(tǒng)的開發(fā),最基本的要求就是熟悉它的開發(fā)API;Foundation既然是系統(tǒng)庫(kù),那任何文件都可以引入它。好,這里有個(gè)問題,如果我們自定義一個(gè)類,引入了Masonry這個(gè)頭文件,同時(shí)又引入了Foundation這個(gè)框架,會(huì)怎么樣?難道系統(tǒng)會(huì)引入兩次Foundation嗎?當(dāng)然不會(huì)了。學(xué)過C語(yǔ)言的同學(xué)應(yīng)該知道#include這個(gè)關(guān)鍵字吧。同時(shí),你應(yīng)該了解@class的用法。將這三兄弟對(duì)比一下,你就會(huì)明白為什么不會(huì)了。
#include:C的關(guān)鍵字,作用是引入某個(gè)文件,缺點(diǎn):會(huì)有重復(fù)引入的問題。
#import:OC的關(guān)鍵字,作用是引入某個(gè)文件,但可以避免重復(fù)引入的問題。
@class:OC的關(guān)鍵字,作用是告訴編譯器,存在這個(gè)文件。用于.h文件中,用來加快編譯速度。
如果要深刻理解這三個(gè)的區(qū)別,必須要了解程序的鏈接過程和意義。推薦一本我最愛的書《程序員的自我修養(yǎng)》。這本書雖然讀起來不如小說有趣,但如飲酒,初飲辛辣難入喉,再飲一秒就上頭,三飲發(fā)誓再不喝,四飲保你無憂愁。
2,F(xiàn)OUNDATION_EXPORT。這是個(gè)什么鬼?好,我們根據(jù)以往的經(jīng)驗(yàn)猜一猜,這個(gè)是用來干啥的?放在文件的靠前位置,后面跟了一個(gè)某類型的未初始化的指針。猜到了沒有?想想#define。想想既然這里沒有定義,那為什么要寫在這里?不饒了,我自己都暈了。這個(gè)是用來定義一個(gè)常量的,作用上和#define一樣,但這個(gè)大神為什么選擇用它而不用#define呢?當(dāng)然不是因?yàn)樾那楹谩?/h6>
==>檢測(cè)字符串的值是否相等的時(shí)候效率更快
FOUNDATION_EXPORT可以直接使用(myString == MyFirstConstant)來比較,
而define則使用的是([myString isEqualToString: MyFirstContant])
第一種是直接比較指針地址
第二種則是一一比較字符串的每一個(gè)字符是否相等.
==>宏定義會(huì)嚴(yán)重拖慢程序的編譯速度。編譯型語(yǔ)言先天不足,不如解釋性語(yǔ)言。如果項(xiàng)目中使用了大量的宏定義,當(dāng)你不得不更改其中某個(gè)值的時(shí)候,在項(xiàng)目后期,你會(huì)眼巴巴的看著進(jìn)度條在那里慢悠悠的調(diào)戲你。
==>宏定義編譯時(shí)只進(jìn)行替換,不進(jìn)行類型校驗(yàn);而FOUNDATION_EXPORT會(huì)進(jìn)行類型校驗(yàn)。這樣在編譯期就可以發(fā)現(xiàn)一些問題。
讀讀這本書《程序員的自我修養(yǎng)》。你不會(huì)失望。
3,由包含的文件而引發(fā)的思考。
庫(kù)中的文件在這里一目了然。這里包含的所有的文件。
注意,前方高能?。。。。。。。。。。?!
為什么會(huì)存在這些文件?
每個(gè)文件是干什么用的?
每個(gè)文件為什么要這樣組織?
文件之間的聯(lián)系是什么?
這些聯(lián)系體現(xiàn)了什么?
現(xiàn)在回到我的第一篇文章iOS進(jìn)階之masonry居高臨下想想這些問題吧少年。
主動(dòng)思考從來都優(yōu)于被動(dòng)接受。
==>檢測(cè)字符串的值是否相等的時(shí)候效率更快
FOUNDATION_EXPORT可以直接使用(myString == MyFirstConstant)來比較,
而define則使用的是([myString isEqualToString: MyFirstContant])
第一種是直接比較指針地址
第二種則是一一比較字符串的每一個(gè)字符是否相等.
==>宏定義會(huì)嚴(yán)重拖慢程序的編譯速度。編譯型語(yǔ)言先天不足,不如解釋性語(yǔ)言。如果項(xiàng)目中使用了大量的宏定義,當(dāng)你不得不更改其中某個(gè)值的時(shí)候,在項(xiàng)目后期,你會(huì)眼巴巴的看著進(jìn)度條在那里慢悠悠的調(diào)戲你。
==>宏定義編譯時(shí)只進(jìn)行替換,不進(jìn)行類型校驗(yàn);而FOUNDATION_EXPORT會(huì)進(jìn)行類型校驗(yàn)。這樣在編譯期就可以發(fā)現(xiàn)一些問題。
相關(guān)鏈接:
程序員的自我修養(yǎng)。請(qǐng)Star一下,表示你愿意和我交朋友。哈哈。