iOS代碼規(guī)范
代碼規(guī)范
遵循原則:見文知意贼邓、清晰簡潔、無錯热鞍。
包括:
命名規(guī)范
代碼規(guī)范
注釋規(guī)范
項(xiàng)目規(guī)范
1葫慎、命名規(guī)范
類名首字母大寫,方法首字母小寫薇宠,方法中的參數(shù)首字母小寫偷办,同時盡量讓方法的命名讀起來像一句話,能夠傳達(dá)出方法的意澄港。
原則:見文知意椒涯。
1)類名命名
采用大駝峰法則,即每個單詞的首字母采用大寫字母回梧。
格式:前綴+名字+類型
前綴:大寫废岂,例如GG
,用于修飾
類型:用于表明類的范圍的狱意,繼承NSObject
的類可不寫
例如:
GGDemoView:前綴:GG湖苞,名字:Demo,類型:View
2)變量命名
采用小駝峰法則详囤,第一個單詞的首字母小寫财骨,后面單詞的首字母全部大寫。
例如:name纬纪,passWord蚓再。
3)常量命名
采用大駝峰法則,前綴加小k包各。
例如:NSString *kPersonName = @”abc”;
4)宏命名
采用大駝峰法則。
例如:#define AppKey @"1235"
5)方法命名
采用小駝峰法則靶庙,第一個單詞的首字母小寫问畅,后面單詞的首字母全部大寫。同時,盡量讓方法名讀起來像是一句話护姆,能夠清晰的傳達(dá)方法要表達(dá)的意思矾端。
例如:
- (instancetype)initWithFrame:(CGRect)frame;
- 取得某個對象,以名詞作為方法的開頭卵皂;
例如:
- (UIImage *)imageName:(NSString *)name;
- 表示執(zhí)行某操作秩铆,以動詞作為方法的開頭,get灯变、make殴玛、set等;
例如:
- (void)setupData;
- 如果方法有參數(shù)添祸,每個參數(shù)前最好有參數(shù)提示滚粟;
例如:
- (instancetype)init:(CGRect)frame; //糟糕的方法命名
- (instancetype)initWithFrame:(CGRect)frame; //好的方法命名
- 如果方法有多個參數(shù),不需要用
and
連接刃泌;
例如:
- (instancetype)initWithFrame:(CGRect)frame andTitle:(NSString *)title; //不是很好
- (instancetype)initWithFrame:(CGRect)frame title:(NSString *)title; //好
- 返回
BOOL
值在方法前加前綴is
凡壤、has
。
例如:
- (BOOL)isEqualToString:(NSString *)aString;
2耙替、代碼規(guī)范
原則:有條理亚侠,層次清晰
1)屬性、變量的聲明
- 屬性俗扇、變量聲明
屬性聲明格式:@property(nonatomic, 關(guān)鍵字) + 1空格 + 類型 + 1空格 + *名稱;
例如:
@property(nonatomic, strong) NSString *name;
特點(diǎn):類型跟星號之間有一個空格硝烂,星號緊跟變量名稱,括號內(nèi)的參數(shù)列表狐援,逗號緊跟前一個參數(shù)再空格接下一個參數(shù)钢坦。
注意:此格式適用于繼承自NSObject類的類型,對于基本數(shù)據(jù)類型的屬性/變量只是沒有“*”的區(qū)別啥酱。
- 屬性的使用
請使用self.
的方式應(yīng)用類的成員變量爹凹,不推薦使用_變量名
的方式。
例如:
推薦使用self.的方式:
self.tableView.delegate = self;
self.tableView.dataSource = self;
不推薦如下的方式:
_tableView.delegate = self;
_tableView.dataSource = self;
2)方法
- 方法聲明的規(guī)范
格式:-/+ + 空格 (類型)方法名;
特點(diǎn):-/+與返回類型之間有個空格镶殷,參數(shù)的類型用括號括起禾酱,參數(shù)之間有一個空格。
例如:
- (instancetype)initWithFrame:(CGRect)frame;
- (instancetype)initWithFrame:(CGRect)frame type:(int)type;
- 方法實(shí)現(xiàn)
特點(diǎn):除上面的2)方法聲明的規(guī)范外绘趋,
1)在方法的結(jié)尾處加一個空格颤陶,然后緊跟大括號“{”;
2)方法與方法之間空一行陷遮。
例如:
- (instancetype)initWithFrame:(CGRect)frame type:(int)type {
}
//方法與方法之間空一行
- (void)viewDidLoad {
[super viewDidLoad];
}
3)變量與方法聲明的位置
對于私有變量滓走、私有方法的聲明,請把它們放在.m文件中帽馋。區(qū)別是不是私有搅方,原則就是這個變量或方法要不要在別的地方使用比吭,若是不要,就不要在.h文件中聲明了姨涡,在.h文件中聲明的就是公開衩藤。
4)操作符前后用1個空格隔開。
例如:
推薦寫法:
NSString *str = @"123456";
NSInteger num = 2;
BOOL flage = num > 1;
str = flage ? @"1" : @"0";
這樣寫程序沒有對與錯涛漂,只是給人感覺有點(diǎn)凌亂:
NSString*str =@"123456";
NSInteger num=2;
BOOL flage=num>1;
str = flage?@"1":@"0";
5)代碼縮進(jìn)
1)使用xcode默認(rèn)縮進(jìn)赏表,即tab = 4space
,快捷鍵:左縮進(jìn)commend+[
匈仗,右縮進(jìn)commend+]
瓢剿;
2)xcode也提供格式化功能,選中代碼锚沸,快捷鍵:control+i
跋选。
6)判斷nil
或YES
/NO
推薦寫法:
if (someObject) { ... }
if (!someObject) { ... }
避免如下寫:
if (someObject == YES) { ...}
if (someObject != nil) { ...}
理由:if (someObject == YES)容易誤寫成賦值語句, if (someObject)寫法也很簡潔。
7)可變類型的變量要初始化
對于mutale
類型的成員變量哗蜈,如NSMutableArray
前标、NSMutableDicyionary
,先要完成初始化距潘,再使用炼列,沒有初始化的話這個變量是為nil的。
8)block
使用block
塊音比,要弱引用對象俭尖,避免循環(huán)引用。使用關(guān)鍵字__weak
或__block
洞翩,__block
可以修飾對象也可修飾基礎(chǔ)數(shù)據(jù)類型的變量稽犁,__weak
只能修飾對象。
規(guī)范寫法如下:
__weak typeof(self) weakSelf = self;
myObj.myBlock = ^{
__strong typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf doSomething]; // strongSelf != nil
// preemption, strongSelf still not nil
[strongSelf doSomethingElse]; // strongSelf != nil
}
else {
// Probably nothing...
return;
}
};
9)移除通知
注冊了observer
骚亿,記得移除它已亥,不限移除時間,但要保證在對象銷毀前移除它来屠,建議在dealloc
方法中將observer
移除虑椎。
10)避免硬編碼
死值每次修改的時候容易被遺忘,也不方便查找俱笛、修改捆姜,另外僅僅看到一個數(shù)字,完全不知道這個數(shù)字代表的意義迎膜∧嗉迹可以采用動態(tài)獲取,定義枚舉磕仅、定義常量(知道含義)的方式零抬。
例如:
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 2; //應(yīng)盡量避免使用具體的數(shù)值镊讼,除非是很明確的情況下
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return self.array.count; //這種方式比寫具體值方便多了宽涌。
}
11)對象判空(nil)處理
對于外部傳過的參數(shù)(特指對象)建議先進(jìn)行空判斷平夜,避免不必要的錯誤,尤其是跟網(wǎng)絡(luò)相關(guān)的數(shù)據(jù)(有可能json解析出來為空)卸亮。
提示:NSArray忽妒、NSDictionary類型的對象是不能添加nil數(shù)據(jù)的。
3兼贸、注釋規(guī)范
注釋方法有單行多行注釋段直,按需求選擇。單行注釋的快捷鍵:commend+/溶诞。
1)變量注釋
2)方法注釋
方法定義必須注釋清楚用途鸯檬、入?yún)⒊鰠⒑x、要求螺垢,建議使用VVdocumenter插件喧务;
備注:xcode 8以后,會發(fā)現(xiàn)常用的注釋插件VVdocumenter無法使用了枉圃。其實(shí)它是被Apple采納了功茴,融合到了xcode中了∧跚祝快捷鍵:option+commend+/
坎穿。(注意:光標(biāo)要位于具體的方法處才有效)
3)類描述
類名最好能描述清楚自身是干什么用的,在頭文件的注釋中增加一行描述返劲;
4)pragma mark
代碼要按功能模塊分塊玲昧,用#pragma mark – name
進(jìn)行分組;
4篮绿、項(xiàng)目規(guī)范
1)項(xiàng)目的目錄結(jié)構(gòu)
一個合理的目錄結(jié)構(gòu)首先應(yīng)該是清晰的孵延,讓人一眼看上去就能大概了解目錄的職責(zé),且容易應(yīng)對新的變化搔耕。
在我們的項(xiàng)目中主目錄按照模塊分類隙袁,內(nèi)目錄按業(yè)務(wù)分類的方式。我們在xcode看到了目錄結(jié)構(gòu)弃榨,也要保證文件在磁盤中的存儲結(jié)構(gòu)也是如此的菩收,方便查找、也方便管理鲸睛。例如娜饵,在xcode創(chuàng)建了一個model目錄,當(dāng)向model目錄中添加文件時官辈,確保文件的存儲位置是在model這個文件夾下箱舞。
2) 項(xiàng)目文件命名規(guī)范
采用大駝峰法則遍坟。但是不限使用中文標(biāo)注,中文標(biāo)注建議用小括號括起來晴股。
例如:Tools(工具)
3)操作上的建議
1)按照目錄層次來放置文件愿伴,建立子目錄。