在類的頭文件中盡量少引用其他頭文件
1."向前聲明"
1
2
3
在類的.h中
@class類的名字
在類的.m中?添加頭文件
在類的.h中
@class類的名字
在類的.m中?添加頭文件
2.說明:
將引入頭文件的時機盡量延后,只在需要的時候才引入,這樣就可以減少類的使用者所需引入的頭文件數(shù)量,減少編譯時間
向前聲明也解決了兩個類互相引用的問題和類之間的耦合
有時候無法使用向前聲明,比如要聲明某個類遵循一項協(xié)議.這種情況下,盡量把 "該類遵循某協(xié)議" 的這條聲明移至 ''class-continuation分類" 中.如果不行的話,就把協(xié)議單獨放在一個頭文件中,然后將其引入.
多用字面量語法,少用與之等價的方法
1.字面量的寫法
1
2
3
4
5
6
7
8
9
10
11
//整數(shù)
NSNumber?*intNumber?=?@1;
//數(shù)組
NSArray?*animals?=?@[@"cat",?@"dog",?@"mouse",?@"badger"];
//去下標(biāo)法
NSString?*dog?=?animals[1];
//字面量字典
NSDictionary?*personData?=?@{@"firstName":?@"Matt",?@"lastName":?@"Galloway",?@"age":?@28};
NSString?*lastName?=?personData[@"lastName"];
//使用字面量語法創(chuàng)建出來的字符串、數(shù)組、字典對象都是不可變.若想要可變的版本對象,則需要復(fù)制一份
NSMutableArray?*mutable?=?[@[@1,?@2,?@3,?@4,?@5]?mutableCopy];
2.局限性
字面量語法有個小小的限制,就是除了字符串以為,所創(chuàng)建出來的對象必須屬于Foundation框架才行.
3.要點
應(yīng)該使用字面量語法來創(chuàng)建字符串、數(shù)組、字典、與創(chuàng)建此類對象的常規(guī)方法相比,這么更加簡明扼要.
應(yīng)該通過取下標(biāo)操作來訪問數(shù)組下標(biāo)或字典中的鍵所對應(yīng)的元素.
用字面量語法創(chuàng)建數(shù)組或字典時,若值中有nil,則會拋出異常,因此,務(wù)必確保值里不含nil.
多用類型常量,少用#define預(yù)處理指令
預(yù)處理定義
1
2
#define?ANIMATIOM_DURATION0.3
說明:預(yù)處理的定義可能是你想要的效果但是這樣定義的常量沒有類型信息,預(yù)處理過程會把碰到的所有ANIMATIOM_DURATION一律替換成0.3假設(shè)此指令聲明在某個頭文件中,那么所有引入了這個頭文件的代碼,?ANIMATIOM_DURATION都會被替換
類型常量的定義
1
2
3
staticconstNSTimeInterval?KAnimationDuration?=0.3;
說明:??*?此方法定義的常量?能清楚的描述常量的含義,有助于編寫開發(fā)文檔,能令閱讀代碼的人更加容易理解
*?命名常量的位置很重要?我們總喜歡在頭文件聲明的預(yù)處理指令,這樣做真的很槽糕,當(dāng)常量的名稱有可能互相沖突的時候更是如此,?ANIMATIOM_DURATION這個常量就不應(yīng)該出現(xiàn)在頭文件中,因為所有引入了這份頭文件的其他文件都會出現(xiàn)這個名字
公開的常量
1
2
3
4
5
說明:此類常量需放在"全局符號表中",以便可以在定義該常量的編譯單元之外使用.因此與staticconst有所不同
//聲明
extern?NSString?*constconstantString;
//實現(xiàn)
NSString?*constconstantString?=?@"constantString";
注意:
不要用預(yù)處理指令定義常量。這樣定義出來的常量不含類型信息,編譯器只是會在編譯前據(jù)此執(zhí)行查找與替換操作。即使有人重新定義了常量值,編譯器也不會產(chǎn)生警告信息,這將導(dǎo)致應(yīng)用中的常量值不一致.
在實現(xiàn)文件中使用static const來定義 只是在編譯單位內(nèi)可見的常量 由于此類常量不在全局符號表中,所以無需為其名稱加前綴
在頭文件中使用extern來聲明全局常量 并在相關(guān)實現(xiàn)文件中定義其值 這種常量要出現(xiàn)在全局符號表中 所以其名稱應(yīng)加以區(qū)隔 通常用與之相關(guān)的類名做前綴
用枚舉表示狀態(tài)、選項、狀態(tài)碼
在以一系列常量來表示錯誤狀態(tài)碼或可組合的選項時,極宜使用枚舉為其命名.
定義枚舉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef?enum?connectionState?{
connectionStateDisConnected,
connectionStateConnecting,
connectionStateConnected
}?state;
彼此組合的枚舉
typedef?NS_OPTIONS(NSUInteger,?UIControlState)?{
UIControlStateNormal???????=0,
UIControlStateHighlighted??=1<<0,//?used?when?UIControl?isHighlighted?is?set
UIControlStateDisabled?????=1<<1,
UIControlStateSelected?????=1<<2,//?flag?usable?by?app?(see?below)
UIControlStateFocused?NS_ENUM_AVAILABLE_IOS(9_0)?=1<<3,//?Applicable?only?when?the?screen?supports?focus
UIControlStateApplication??=0x00FF0000,//?additional?flags?available?for?application?use
UIControlStateReserved?????=0xFF000000//?flags?reserved?for?internal?framework?use
};
注意點:
應(yīng)用枚舉來表示狀態(tài)機的狀態(tài) 傳遞給方法的選項以及狀態(tài)碼等值 給這些值起個易懂的名字
如果把傳遞給某個方法的選項表示為枚舉類型,而多個選項又可同時使用 那么就將各選項值為2的冪 以便通過按位或操作將其組合起來
用NS_OPTIONS宏來定義枚舉類型 并指明底層數(shù)據(jù)類型 這樣做可以確保枚舉是用開發(fā)者所選的底層數(shù)據(jù)類型實現(xiàn)出來的 而不會采用編譯器所選的類型