- 關于命名
1> 統(tǒng)一要求
? 含義清楚谱邪,盡量做到不需要注釋也能了解其作用赦拘,若做不到肃拜,就加注釋
? 使用全稱,不適用縮寫
2> 類的命名
? 大駝峰式命名:每個單詞的首字母都采用大寫字母
例子:MFHomePageViewController
? 后綴要求
ViewController: 使用ViewController做后綴
例子: MFHomePageViewController
View: 使用View做后綴
例子: MFAlertView
UITableCell:使用Cell做后綴
例子: MFNewsCell
Protocol: 使用Delegate或者DataSource作為后綴
例子: UITableViewDelegate
UI控件依次類推
3> 方法命名
? 小駝峰式命名备徐,每一段都以小寫字母開頭萄传,后面的單詞首字母大寫
? 要符合英語語法,使方法名簡單干練蜜猾,便于理解,語義通順
正確示例:
- (NSInteger)heightOfAttributedString:(NSAttributedString *)attributedString byLimitWidth:(CGFloat)limitWidth;
錯誤示例: - (NSInteger)getAttributedStringHeightWithString:(NSAttributedString )string widthValue:(int)width;
4> 私有變量
? 小駝峰式命名:第一個單詞以小寫字母開始振诬,后面的單詞的首字母全部大寫
例子:firstName蹭睡、lastName
? 以 _ 開頭,第一個單詞首字母小寫
例子:NSString * _somePrivateVariable;
? 私有變量放在 .m 文件中聲明
5> property變量
? 小駝峰式命名
例子:
/*
用戶名
*/
@property (nonatomic, copy) NSString *userName;
? 禁止使用synthesize關鍵詞
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命名
? 當另一個對象中可能用到該類的多個實例時,類的實例必須為回調(diào)方法的參數(shù)之一, 如
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
? 回調(diào)方法的參數(shù)只有類自己的情況放闺,方法名要符合實際含義, 如:- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
? 以類的名字開頭(回調(diào)方法存在兩個以上參數(shù)的情況)以表明此方法是屬于哪個類的, 如: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
? 充分利用動詞的不同時態(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進行修飾篡悟。
例子1:
import "ViewController.h"
@interface ViewController ()
// 在這個category(類目)中定義變量和方法
@end
@implementation ViewController {
// 聲明私有變量
}
例子2:
@interface ViewController : UIViewController {
@private
NSString *name;
}
- 關于注釋
最好的代碼是不需要注釋的 盡量通過合理的命名
良好的代碼把含義表達清楚 在必要的地方添加注釋
注釋需要與代碼同步更新
如果做不到命名盡量的見名知意的話,就可以適當?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;
- 關于UI布局
推薦使用純代碼寫UI匾寝,方便其他人修改和理解搬葬。除了UITableViewCell,這個類使用xib具有一定的優(yōu)勢艳悔。
Xib文件的命名與其對應的.h文件保持相同
Xib文件中控件的組織結構要合理急凰,Xib文件中控件需要有合理的可讀性強的命名,方便他人理解 - 格式化代碼
1> 指針 "" 位置
定義一個對象時猜年,指針 "" 靠近變量
例子: NSString *userName;
2> 方法的聲明和定義
在 - 抡锈、+ 和 返回值 之間留一個空格,方法名和第一個參數(shù)之間不留空格
- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil {
…
}
3> 代碼縮進
? 使用 xcode 默認縮進码倦,即 tab = 4空格
? 使用 xcode 中 re-indent 功能定期對代碼格式進行整理
? 相同類型變量聲明需要獨行聲明
例子:
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> 對method進行分組
使用 #pragma mark - 方式對類的方法進行分組
例子:
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> 大括號寫法
? 左括號在方法名后隔一個空格
例子:(void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
? 任何需要寫大括號的部分企孩,不得省略
錯誤示例:(void)wrongExamples {
BOOL someCondition = YES;
if (someCondition)
NSLog(@"this is wrong!!!");
while(someCondition)
NSLog(@"this is wrong!!!");
}
6> 警告
? 需要添加警告的地方寫上warning和注釋怔蚌,在編譯的過程中會注意到
示例:(void)goBack {
warning 待完善
}
? 對于過期的方法爹土、類吮螺、結構體和枚舉等,使用系統(tǒng)自帶的deprecated系列和NS_UNAVAILABLE
方法警告饱溢。
- 目錄格式
1> 根據(jù)項目的功能從大塊到小塊對文件用不同的文件夾進行分裝;
2> 按照項目的功能進行分類的瘦馍,文件夾用中文命名碳褒;
3> 按照代碼的功能進行分類的,文件夾可以用英文或中文命名莲组;
4> 第三方庫和工具單獨存放到一個文件夾诊胞;
5> 根據(jù)情況,小尺寸圖片統(tǒng)一放到Assets.xcassets锹杈,同樣用文件夾分類存放撵孤;
6> 其他圖片,尤其是大圖竭望,要放在boundle里邪码,一般放在“/Resources/圖片/”里;
7> 通用的類咬清,根據(jù)視圖闭专、模型和控制器的分類用不同文件夾分類存放;
8> 具體到某一個小模塊旧烧,則根據(jù)MVC對文件進行分類影钉。 - git代碼管理
1> 先更新,再提交掘剪;
2> 提交的時候帶上自己的名字平委,干了什么就寫什么,不得遺漏杖小;
3> 有重要的提交肆汹,要通知一下其他組員;
4> git分支用版本號作為后綴予权。 - 其他細節(jié)
1> 在Runtime+KVC面前成員變量沒有公私之分昂勉,建議全部使用@property聲明屬性,“私有變量”的放在.m文件中的extension中聲明即可扫腺,.h文件中公開的屬性應合理使用readonly修飾岗照。使用@property還有個優(yōu)勢,方便內(nèi)存管理笆环,規(guī)避循環(huán)引用攒至;
2> 控制器類中的代碼盡量不要超過500行,借助繼承躁劣、多態(tài)迫吐、封裝三大特性和MVC、MVVM思想簡化账忘、拆分代碼志膀;
3> 避免使用left熙宇、right、123等字樣進行View控件命名溉浙,以免后續(xù)的UI修改導致命名沖突烫止;
4> 聲明UIView及其子類屬性盡量用weak修飾;
5> ARC環(huán)境下聲明NSArray/NSDictionary/NSString屬性戳稽,用copy馆蠕;聲明前三者可變子類屬性用strong;
6> 擁有相同功能的類封裝成父類惊奇;
7> control+i 組合鍵互躬,自動對齊;
8> MJRefresh赊时、AFNetworking在迭代過程中都出現(xiàn)過修改方法名的情況吨铸,比較成熟的解決方案是創(chuàng)建橋梁分類,封裝常用的方法祖秒。如果第三方庫出現(xiàn)命名修改,只要修改橋梁分類中的內(nèi)容即可舟奠,不用每個類都去改方法竭缝,節(jié)省大量時間。這種解耦思想同樣適用于NSTimer沼瘫,能主動解除循環(huán)引用抬纸。詳情見[https://github.com/XiFengLang/JKKit-OC/tree/master/JKKit/4.自釋放定時器];
9> 盡量不要在預編譯頭文件里引入太多文件耿戚,盡量精簡湿故;
10> 分類(category)根據(jù)功能進行分類和命名;
11> 圖片命名根據(jù)模塊(子模塊)功能進行命名膜蛔;
12> 注意對象的內(nèi)存釋放問題坛猪,防止循環(huán)引用。