- 關(guān)于命名
1> 統(tǒng)一要求
? 含義清楚,盡量做到不需要注釋也能了解其作用,若做不到,就加注釋
? 使用全稱,不適用縮寫
2> 類的命名
? 大駝峰式命名:每個(gè)單詞的首字母都采用大寫字母
例子:MFHomePageViewController
? 后綴要求
ViewController: 使用ViewController做后綴
例子: MFHomePageViewController
View: 使用View做后綴
例子: MFAlertView
UITableCell:使用Cell做后綴
例子: MFNewsCell
Protocol: 使用Delegate或者DataSource作為后綴
例子: UITableViewDelegate
UI控件依次類推
3> 方法命名
? 小駝峰式命名,每一段都以小寫字母開頭,后面的單詞首字母大寫
? 要符合英語語法,使方法名簡單干練,便于理解,語義通順
正確示例:
- (NSInteger)heightOfAttributedString:(NSAttributedString *)attributedString byLimitWidth:(CGFloat)limitWidth;
錯(cuò)誤示例: - (NSInteger)getAttributedStringHeightWithString:(NSAttributedString )string widthValue:(int)width;
4> 私有變量
? 小駝峰式命名:第一個(gè)單詞以小寫字母開始,后面的單詞的首字母全部大寫
例子:firstName、lastName
? 以 _ 開頭,第一個(gè)單詞首字母小寫
例子:NSString * _somePrivateVariable;
? 私有變量放在 .m 文件中聲明
5> property變量
? 小駝峰式命名
例子:
/*
用戶名
*/
@property (nonatomic, copy) NSString *userName;
? 禁止使用synthesize關(guān)鍵詞
6> 宏命名
? 全部大寫,單詞間用 _ 分隔。[不帶參數(shù)]
例子: #define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"
? 以字母 k 開頭,后面遵循大駝峰命名。[不帶參數(shù)]
例子:#define kWidth self.frame.size.width
? 小駝峰命名。[帶參數(shù)]
例子:
define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]
7> Enum
? Enum類型的命名與類的命名規(guī)則一致
? Enum中枚舉內(nèi)容的命名需要以該Enum類型名稱開頭
例子:
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2
};
8> Delegate命名
? 當(dāng)另一個(gè)對(duì)象中可能用到該類的多個(gè)實(shí)例時(shí),類的實(shí)例必須為回調(diào)方法的參數(shù)之一, 如
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
? 回調(diào)方法的參數(shù)只有類自己的情況,方法名要符合實(shí)際含義, 如:- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
? 以類的名字開頭(回調(diào)方法存在兩個(gè)以上參數(shù)的情況)以表明此方法是屬于哪個(gè)類的, 如: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
? 充分利用動(dòng)詞的不同時(shí)態(tài)例如did和will通知Delegate已經(jīng)發(fā)生的變化或?qū)⒁l(fā)生的變化, 如:
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath; - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- 私有方法、屬性及變量聲明
1> 聲明位置
在.m文件中最上方。如果需要顯示到頭文件,可以使用@private進(jìn)行修飾。
例子1:
import "ViewController.h"
@interface ViewController ()
// 在這個(gè)category(類目)中定義變量和方法
@end
@implementation ViewController {
// 聲明私有變量
}
例子2:
@interface ViewController : UIViewController {
@private
NSString *name;
}
- 關(guān)于注釋
最好的代碼是不需要注釋的 盡量通過合理的命名
良好的代碼把含義表達(dá)清楚 在必要的地方添加注釋
注釋需要與代碼同步更新
如果做不到命名盡量的見名知意的話,就可以適當(dāng)?shù)奶砑右恍┳⑨尰蛘適ark
1> 屬性注釋和方法聲明注釋
使用系統(tǒng)自帶的“option+command+/”
/**
代理方法
@param personID 登錄ID
@param password 密碼
@param completeHandler 完成回調(diào)
*/
- (void)loginWithPersonID:(NSString *)personID password:(NSString *)password completeHandler:(void (^)(checkLogon *result))completeHandler;
- 關(guān)于UI布局
推薦使用純代碼寫UI,方便其他人修改和理解。除了UITableViewCell,這個(gè)類使用xib具有一定的優(yōu)勢(shì)。
Xib文件的命名與其對(duì)應(yīng)的.h文件保持相同
Xib文件中控件的組織結(jié)構(gòu)要合理,Xib文件中控件需要有合理的可讀性強(qiáng)的命名,方便他人理解 - 格式化代碼
1> 指針 "" 位置
定義一個(gè)對(duì)象時(shí),指針 "" 靠近變量
例子: NSString *userName;
2> 方法的聲明和定義
在 - 、+ 和 返回值 之間留一個(gè)空格,方法名和第一個(gè)參數(shù)之間不留空格
- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil {
…
}
3> 代碼縮進(jìn)
? 使用 xcode 默認(rèn)縮進(jìn),即 tab = 4空格
? 使用 xcode 中 re-indent 功能定期對(duì)代碼格式進(jìn)行整理
? 相同類型變量聲明需要獨(dú)行聲明
例子:
CGFloat oringX = self.view.frame.origin.x;
CGFloat oringY = self.view.frame.origin.y;
CGFloat lineWidth = self.view.frame.size.width;
? Method與Method之間空一行
例子:
@implementation ViewController
(void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}(void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
4> 對(duì)method進(jìn)行分組
使用 #pragma mark - 方式對(duì)類的方法進(jìn)行分組
例子:
pragma mark – 私有方法
(void)samplePrivateMethod {
//...
}(void)sampleForIf {
//...
}(void)sampleForWhile {
//...
}(void)sampleForSwitch {
//...
}(void)wrongExamples {
//...
}
pragma mark – 公有方法
- (void)samplePublicMethodWithParam:(NSString*)sampleParam {
//...
}
pragma mark – 生命周期
(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
//...
}(void)viewDidLoad {
//...
}(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
//...
}
5> 大括號(hào)寫法
? 左括號(hào)在方法名后隔一個(gè)空格
例子:(void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
? 任何需要寫大括號(hào)的部分,不得省略
錯(cuò)誤示例:(void)wrongExamples {
BOOL someCondition = YES;
if (someCondition)
NSLog(@"this is wrong!!!");
while(someCondition)
NSLog(@"this is wrong!!!");
}
6> 警告
? 需要添加警告的地方寫上warning和注釋,在編譯的過程中會(huì)注意到
示例:(void)goBack {
warning 待完善
}
? 對(duì)于過期的方法、類、結(jié)構(gòu)體和枚舉等,使用系統(tǒng)自帶的deprecated系列和NS_UNAVAILABLE
方法警告。
- 目錄格式
1> 根據(jù)項(xiàng)目的功能從大塊到小塊對(duì)文件用不同的文件夾進(jìn)行分裝;
2> 按照項(xiàng)目的功能進(jìn)行分類的,文件夾用中文命名;
3> 按照代碼的功能進(jìn)行分類的,文件夾可以用英文或中文命名;
4> 第三方庫和工具單獨(dú)存放到一個(gè)文件夾;
5> 根據(jù)情況,小尺寸圖片統(tǒng)一放到Assets.xcassets,同樣用文件夾分類存放;
6> 其他圖片,尤其是大圖,要放在boundle里,一般放在“/Resources/圖片/”里;
7> 通用的類,根據(jù)視圖、模型和控制器的分類用不同文件夾分類存放;
8> 具體到某一個(gè)小模塊,則根據(jù)MVC對(duì)文件進(jìn)行分類。 - git代碼管理
1> 先更新,再提交;
2> 提交的時(shí)候帶上自己的名字,干了什么就寫什么,不得遺漏;
3> 有重要的提交,要通知一下其他組員;
4> git分支用版本號(hào)作為后綴。 - 其他細(xì)節(jié)
1> 在Runtime+KVC面前成員變量沒有公私之分,建議全部使用@property聲明屬性,“私有變量”的放在.m文件中的extension中聲明即可,.h文件中公開的屬性應(yīng)合理使用readonly修飾。使用@property還有個(gè)優(yōu)勢(shì),方便內(nèi)存管理,規(guī)避循環(huán)引用;
2> 控制器類中的代碼盡量不要超過500行,借助繼承、多態(tài)、封裝三大特性和MVC、MVVM思想簡化、拆分代碼;
3> 避免使用left、right、123等字樣進(jìn)行View控件命名,以免后續(xù)的UI修改導(dǎo)致命名沖突;
4> 聲明UIView及其子類屬性盡量用weak修飾;
5> ARC環(huán)境下聲明NSArray/NSDictionary/NSString屬性,用copy;聲明前三者可變子類屬性用strong;
6> 擁有相同功能的類封裝成父類;
7> control+i 組合鍵,自動(dòng)對(duì)齊;
8> MJRefresh、AFNetworking在迭代過程中都出現(xiàn)過修改方法名的情況,比較成熟的解決方案是創(chuàng)建橋梁分類,封裝常用的方法。如果第三方庫出現(xiàn)命名修改,只要修改橋梁分類中的內(nèi)容即可,不用每個(gè)類都去改方法,節(jié)省大量時(shí)間。這種解耦思想同樣適用于NSTimer,能主動(dòng)解除循環(huán)引用。詳情見[https://github.com/XiFengLang/JKKit-OC/tree/master/JKKit/4.自釋放定時(shí)器];
9> 盡量不要在預(yù)編譯頭文件里引入太多文件,盡量精簡;
10> 分類(category)根據(jù)功能進(jìn)行分類和命名;
11> 圖片命名根據(jù)模塊(子模塊)功能進(jìn)行命名;
12> 注意對(duì)象的內(nèi)存釋放問題,防止循環(huán)引用。