1. 關(guān)于命名
1.統(tǒng)一要求
含義清楚,盡量做到不需要注釋也能了解其作用偏塞,若做不到府瞄,就加注釋?zhuān)皇褂萌Q(chēng)廉赔,不使用縮寫(xiě)
2 類(lèi)的命名
大駝峰式命名:每個(gè)單詞的首字母都采用大寫(xiě)字母
例子:
TWHomePageViewController
后綴要求
ViewController: 使用ViewController做后綴
例子:
MFHomeViewController
View: 使用View做后綴
例子:
MFAlertView
UITableCell:使用Cell做后綴
例子:
MFNewsCell
Protocol: 使用Delegate或者DataSource作為后綴
例子:
UITableViewDelegate
UI控件依次類(lèi)推
3 私有變量
小駝峰式命名:第一個(gè)單詞以小寫(xiě)字母開(kāi)始青抛,后面的單詞的首字母全部大寫(xiě)
例子:firstName、lastName
以 _ 開(kāi)頭酬核,第一個(gè)單詞首字母小寫(xiě)
例子:NSString * _somePrivateVariable
私有變量放在 .m 文件中聲明
4 property變量
小駝峰式命名
//例子:
@property (nonatomic, copy) NSString *userName;
禁止使用synthesize關(guān)鍵詞
5 宏命名
全部大寫(xiě)蜜另,單詞間用 _ 分隔。[不帶參數(shù)]
例子:
#define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"
常量以字母 k 開(kāi)頭嫡意,后面遵循大駝峰命名举瑰。[不帶參數(shù)]
例子:
#define kWidth 320.0
小駝峰命名。[帶參數(shù)]
#define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]
6 Enum
Enum類(lèi)型的命名與類(lèi)的命名規(guī)則一致
Enum中枚舉內(nèi)容的命名需要以該Enum類(lèi)型名稱(chēng)開(kāi)頭
例子:
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2
};
7 Delegate命名
類(lèi)的實(shí)例必須為回調(diào)方法的參數(shù)之一, 如
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
回調(diào)方法的參數(shù)只有類(lèi)自己的情況蔬螟,方法名要符合實(shí)際含義, 如:
-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
以類(lèi)的名字開(kāi)頭(回調(diào)方法存在兩個(gè)以上參數(shù)的情況)以表明此方法是屬于哪個(gè)類(lèi)的, 如:
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
使用did和will通知Delegate已經(jīng)發(fā)生的變化或?qū)⒁l(fā)生的變化, 如:
-(NSIndexPath*)tableView:(UITableView*)tableView willSelectRowAtIndexPath:(NSIndexPath*)indexPath;
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath;
2. 私有方法及變量聲明
1 聲明位置
在.m文件中最上方此迅,定義空的category進(jìn)行聲明
例子:
#import "CodeStandardViewController.h"
// 在這個(gè)category(類(lèi)目)中定義變量和方法
@interface CodeStandardViewController ()
{
// 聲明私有變量
}
// 私有方法
- (void)samplePrivateMethod;
@end
@implementation CodeStandardViewController
// 私有方法的實(shí)現(xiàn)
- (void)samplePrivateMethod{
//some code
}
3. 關(guān)于注釋
盡管寫(xiě)的時(shí)候很痛苦,但是他們對(duì)于保持你代碼的可讀性來(lái)說(shuō)絕對(duì)是至關(guān)重要的旧巾。下面幾條規(guī)則描述了你應(yīng)該什么時(shí)候在什么地方加注釋耸序。
但是要記住,雖然注釋很重要鲁猩,但是最好的代碼都是自注釋的坎怪。給變量和類(lèi)型一個(gè)有意義的名字,要比用一個(gè)難懂的名字然后再費(fèi)力的用注釋來(lái)解釋好得多廓握。
寫(xiě)注釋的時(shí)候搅窿,要寫(xiě)給你的讀者:下一個(gè)要讀懂你代碼的貢獻(xiàn)者。多寫(xiě)點(diǎn)吧——下個(gè)沒(méi)準(zhǔn)就是你自己隙券!
注釋需要與代碼同步更新
1 File Comments文件注釋
可以有選擇的在一個(gè)文件開(kāi)頭寫(xiě)一段關(guān)于內(nèi)容的描述男应。
2 屬性注釋
快捷鍵: 光標(biāo)放在屬性名前面 command+option+/
例子:
/**
學(xué)生
*/
@property (nonatomic, strong) Student *student;
3 方法聲明注釋Declaration Comments
快捷鍵: 光標(biāo)放在方法名前面 command+option+/
每個(gè)接口,類(lèi)別娱仔,協(xié)議的聲明都應(yīng)該有個(gè)伴隨的注釋?zhuān)瑏?lái)描述他的作用以及他如何融入整體環(huán)境
/**
登錄驗(yàn)證
@param personId 用戶(hù)名
@param password 密碼
@param complete 執(zhí)行完畢的block
*/
+ (void)loginWithPersonId:(NSString *)personId password:(NSString *)password complete:(void (^)(CheckLogon *result))complete;
4 實(shí)現(xiàn)聲明Implementation Comments
用豎向排列方式在注釋中引用變量名和符號(hào)沐飘,不要寫(xiě)成一整行。
4. 關(guān)于UI布局
使用Interface Builder進(jìn)行界面布局
Xib文件的命名與其對(duì)應(yīng)的.h文件保持相同
Xib文件中控件的組織結(jié)構(gòu)要合理拟枚,Xib文件中控件需要有合理的可讀性強(qiáng)的命名薪铜,方便他人理解
5. 格式化代碼
1 指針 "*" 位置
定義一個(gè)對(duì)象時(shí),指針 "*" 靠近變量
//例子:
NSString *userName;
2 方法的聲明和定義
在 "-" 恩溅、"+" 和 返回值之間留一個(gè)空格隔箍,方法名和第一個(gè)參數(shù)之間不留空格
“=”、“==”脚乡、“>=”蜒滩、“<=”滨达、“/”、“%”等符號(hào)前后需要均需有一個(gè)空格
“]” 后面如果跟的是方法名俯艰,需要有一個(gè)空格
- (id)initWithNibName:(NSString *)nibName nibBundle:(NSBundle *)nibBundle{}
3代碼縮進(jìn)
使用 xcode 默認(rèn)縮進(jìn)捡遍,即 tab = 4空格
使用 xcode 中 re-indent 功能定期對(duì)代碼格式進(jìn)行整理
相同類(lèi)型變量聲明需要獨(dú)行聲明
例子:
CGFloatOriginX = frame.origin.x;
CGFloatOriginY = frame.origin.y;
CGFloatlineWidth = frame.size.width;
Method與Method之間最多空一行郎汪,但要在一個(gè)項(xiàng)目里統(tǒng)一攻旦,要么都空一行,要么都不空行
例子:
#pragma mark - private methods
- (void)samplePrivateMethod{}
- (void)sampleForIf {}
復(fù)制代碼
4 對(duì)method進(jìn)行分組
使用 #pragma mark - 方式對(duì)類(lèi)的方法進(jìn)行分組
例子:
#pragma mark -
#pragma mark - private
- (void)samplePrivateMethod{}
- (void)sampleForIf{}
- (void)wrongExamples{}
#pragma mark -
#pragma mark - public methods
- (void)samplePublicMethodWithParam:(NSString*)sampleParam{}
#pragma mark -
#pragma mark - life cycle methods
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{}
- (void)viewDidLoad{}
5 大括號(hào)寫(xiě)法
對(duì)于類(lèi)的method: 左括號(hào)另起一行寫(xiě)(蘋(píng)果官方文檔)龄捡,但是我個(gè)人覺(jué)得左括號(hào)跟在第一行后邊會(huì)更好啦辐,因?yàn)檫@樣把代碼折疊起來(lái)效果更好谓传,可以看到的方法更多
例子:
- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil{
self = [super initWithNibName:nibName OrNilbundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
對(duì)于其他使用場(chǎng)景: 左括號(hào)跟在第一行后邊
例子:
- (void)sampleForIf {
BOOL someCondition = YES;
if(someCondition) {
// do something here
}
}
- (void)sampleForWhile {
int i = 0;
while (i < 10) {
// do something here
i = i + 1;
}
}
- (void)sampleForSwitch{
SampleEnum testEnum = SampleEnumTwo;
switch(testEnum) {
caseSampleEnumUndefined:{
// do something
break;
}
caseSampleEnumOne:{
// do something
break;
}
caseSampleEnumTwo:{
// do something
break;
}
default:{
NSLog(@"WARNING: there is an enum type not handled properly!");
break;
}
}
}
任何需要寫(xiě)大括號(hào)的部分,不得省略
錯(cuò)誤示例:
- (void)wrongExamples{
BOOLsomeCondition = YES;
if (someCondition)
NSLog(@"this is wrong!!!");
while(someCondition)
NSLog(@"this is wrong!!!");
}
6 代碼寬度芹关、函數(shù)的行數(shù)续挟、類(lèi)的行數(shù)
每行的寬度
應(yīng)盡量在你的代碼中將每行控制在80個(gè)字符內(nèi)。
每個(gè)函數(shù)的行數(shù)
應(yīng)盡量在你的代碼中將每個(gè)函數(shù)的行數(shù)控制在100行內(nèi)侥衬。
每個(gè)類(lèi)的行數(shù)
應(yīng)盡量在你的代碼中將每個(gè)類(lèi)的行數(shù)控制在1000行內(nèi)诗祸。
盡量使用新的API
項(xiàng)目最低適配系統(tǒng)如果設(shè)置的是在iOS8以上
建議把UIActionSheet和UIAlertView統(tǒng)一升級(jí)為UIAlertController
建議把UIWebView升級(jí)為WKWebView
項(xiàng)目最低適配系統(tǒng)如果設(shè)置的是在iOS9以上
建議把AddressBook升級(jí)為Contacts