iOS Objective-C Code Style
前言 : 為了使代碼清晰簡潔,方便閱讀理解陕悬,都會統(tǒng)一遵從一定的代碼規(guī)范 .
本期使用MVC框架 , 保持公共API 的簡潔性 .
一、命名
1.每行的長度
每行的長度不得超過 120 個字符
設(shè)置: “Xcode => Preferences => TextEditing => 勾選 Show Page Guide / 輸入100 => OK”
2.關(guān)于命名
統(tǒng)一要求 : 含義清楚喳坠,盡量做到不需要注釋也能了解其作用杈曲,若做不到,就加注釋 .
按照駝峰式命名法則:(大駝峰:每個單詞首字母都大寫--小駝峰:第一個單子首字母小寫,其余都大寫)
類名首字母大寫,方法首字母小寫,方法中的參數(shù)首字母小寫,長度無限制.
盡量方法名讀起來一句話
變量名的大小在2-20個字母之間,避免單字母變量.
1>property變量
@property (nonatomic, strong) NSMutableArray *駝峰命名規(guī)則:
指針*要靠近變量名
前部分參數(shù)用途: path
后部分參數(shù)類型: muArr
最后: 注釋(若后期維護(hù)新添加或刪除的變量-加自個名字)
@property (nonatomic, strong) NSMutableArray *pathMuArr;//可變數(shù)組用來儲存路徑- LYG
縮寫規(guī)則:
(如:表)
字符串
NSString
str
可變字符串
NSMutableString
muStr
字典
NSDictionary
dic
可變字典
NSMutableDictionary
muDic
數(shù)組
NSArray
arr
可變數(shù)組
NSMutableArray
muArr
數(shù)據(jù)
NSData
data
可變數(shù)組
NSMutableData
muData
標(biāo)簽
UILabel
label
按鈕
UIButton
btn
圖片
UIImage
img
圖片視圖
UIImageView
imgV
bool 值
BOOL
is…
UINavigationController
nav
backgroundColor
bg
UITableViewCell
cell
UIViewController
viewController
UIView
view
2>宏 Define
? 全部大寫,單詞用_進(jìn)行分割(不帶參數(shù))
#define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"
? 以字母 k 開頭,后面要遵循大駝峰命名規(guī)則(不帶參數(shù))
#define kDefaultLineWidth 8
#define kWidth self.frame.size.width
? 小駝峰命名(帶參數(shù))
#define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]
3>枚舉 Eeum
? 枚舉命名和類的命名一樣
? 枚舉中的內(nèi)容命名需要以改枚舉類型名稱開頭
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2
};
typedef NS_ENUM(NSInteger ,DrawStyle){
DrawStyleFreedomLine = 100,
DrawStyleLine = 1,
DrawStyleCircle = 2,
DrawStyleRectangle = 3,
DrawStyleOval = 4,
DrawStyleTriangle = 5,
DrawStyleCurve = 6,
DrawStyleRubber = 7
};
4>代理 Delegate
Protocol : 使用 delegate 作為后綴
? 類的實例必須為回調(diào)方法的參數(shù)之一(numberOfRowsInSection中的section)
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
? 回調(diào)方法的參數(shù)只有類自己的情況非驮,方法名要符合實際含義(numberOfSectionsInTableView)
-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
? 以類的名字開頭(回調(diào)方法存在兩個以上參數(shù)的情況)以表明此方法是屬于哪個類的(tableView)
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
類型標(biāo)示符交汤、代理名稱、尖括號間不留空格
該規(guī)則同樣適用于:類聲明劫笙、實例變量和方法聲明
每一個delegate都把對應(yīng)的protocol名字帶上芙扎,delegate方法不要亂寫,寫到一塊區(qū)域里面去
@interface MyProtocoledClass : NSObject<NSWindowDelegate> {
@private
id<MyFancyDelegate> _delegate;
}
- (void)setDelegate:(id<MyFancyDelegate>)aDelegate;@end
如果類聲明中包含多個protocal,每個protocal占用一行,縮進(jìn)4個字符填大。
如:
@interface CustomViewController : ViewController<
AbcDelegate,
DefDelegate
{
... }
5>block
使用Block時戒洼,內(nèi)容四個空格縮進(jìn),“^”后帶有參數(shù)時允华,參數(shù)與“{”之間有一個空格縮進(jìn)
@property (nonatomic ,copy) void (^colorBlock)(UIColor *);
6>方法的聲明和定義
? 在 - OR + 和返回值之間留 1 個空格,方法名和第一個參數(shù)間不留空格
- (void)doSomethingWithString:(NSString *)theString
{
...
}
? 當(dāng)參數(shù)過長時,每個參數(shù)占用一行,以冒號對齊
- (void)doSomethingWith:(GTMFoo *)theFoo
rect:(NSRect)theRect
interval:(float)theInterval
{
...
}
? 如果方法名比參數(shù)名短,每個參數(shù)占用一行,至少縮進(jìn)4個字符,且為垂直對齊
- (void)writeA:(NSString *)firstStr
withBBBBBBBBBBB:(NSString *)nextStr
withCCCCCC:(NSString *)lastStr
{
...
}
? Method與Method之間空一行(官方規(guī)定左括號應(yīng)另起一行)
- (void)samplePrivateMethod
{
...
}
- (void)sampleForIf
{
...
}
7>使用#pragma Mark - 標(biāo)注一類函數(shù)圈浇,便于查找
iOS Objective-C Code Style
前言 : 為了使代碼清晰簡潔,方便閱讀理解靴寂,都會統(tǒng)一遵從一定的代碼規(guī)范 .
本期使用MVC框架 , 保持公共API 的簡潔性 .
一磷蜀、命名
1.每行的長度
每行的長度不得超過 120 個字符
設(shè)置: “Xcode => Preferences => TextEditing => 勾選 Show Page Guide / 輸入100 => OK”
2.關(guān)于命名
統(tǒng)一要求 : 含義清楚,盡量做到不需要注釋也能了解其作用百炬,若做不到褐隆,就加注釋 .
按照駝峰式命名法則:(大駝峰:每個單詞首字母都大寫--小駝峰:第一個單子首字母小寫,其余都大寫)
類名首字母大寫,方法首字母小寫,方法中的參數(shù)首字母小寫,長度無限制.
盡量方法名讀起來一句話
變量名的大小在2-20個字母之間,避免單字母變量.
1>property變量
@property (nonatomic, strong) NSMutableArray *駝峰命名規(guī)則:
指針*要靠近變量名
前部分參數(shù)用途: path
后部分參數(shù)類型: muArr
最后: 注釋(若后期維護(hù)新添加或刪除的變量-加自個名字)
@property (nonatomic, strong) NSMutableArray *pathMuArr;//可變數(shù)組用來儲存路徑- LYG
縮寫規(guī)則:
(如:表)
字符串
NSString
str
可變字符串
NSMutableString
muStr
字典
NSDictionary
dic
可變字典
NSMutableDictionary
muDic
數(shù)組
NSArray
arr
可變數(shù)組
NSMutableArray
muArr
數(shù)據(jù)
NSData
data
可變數(shù)組
NSMutableData
muData
標(biāo)簽
UILabel
label
按鈕
UIButton
btn
圖片
UIImage
img
圖片視圖
UIImageView
imgV
bool 值
BOOL
is…
UINavigationController
nav
backgroundColor
bg
UITableViewCell
cell
UIViewController
viewController
UIView
view
2>宏 Define
? 全部大寫,單詞用_進(jìn)行分割(不帶參數(shù))
#define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"
? 以字母 k 開頭,后面要遵循大駝峰命名規(guī)則(不帶參數(shù))
#define kDefaultLineWidth 8
#define kWidth self.frame.size.width
? 小駝峰命名(帶參數(shù))
#define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]
3>枚舉 Eeum
? 枚舉命名和類的命名一樣
? 枚舉中的內(nèi)容命名需要以改枚舉類型名稱開頭
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2
};
typedef NS_ENUM(NSInteger ,DrawStyle){
DrawStyleFreedomLine = 100,
DrawStyleLine = 1,
DrawStyleCircle = 2,
DrawStyleRectangle = 3,
DrawStyleOval = 4,
DrawStyleTriangle = 5,
DrawStyleCurve = 6,
DrawStyleRubber = 7
};
4>代理 Delegate
Protocol : 使用 delegate 作為后綴
? 類的實例必須為回調(diào)方法的參數(shù)之一(numberOfRowsInSection中的section)
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
? 回調(diào)方法的參數(shù)只有類自己的情況剖踊,方法名要符合實際含義(numberOfSectionsInTableView)
-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
? 以類的名字開頭(回調(diào)方法存在兩個以上參數(shù)的情況)以表明此方法是屬于哪個類的(tableView)
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
類型標(biāo)示符庶弃、代理名稱轨蛤、尖括號間不留空格
該規(guī)則同樣適用于:類聲明、實例變量和方法聲明每一個delegate都把對應(yīng)的protocol名字帶上虫埂,delegate方法不要亂寫祥山,寫到一塊區(qū)域里面去
@interface MyProtocoledClass : NSObject<NSWindowDelegate> {
@private
id<MyFancyDelegate> _delegate;
}
- (void)setDelegate:(id<MyFancyDelegate>)aDelegate;@end
如果類聲明中包含多個protocal,每個protocal占用一行,縮進(jìn)4個字符。
如:
@interface CustomViewController : ViewController<
AbcDelegate,
DefDelegate
{
... }
5>block
使用Block時掉伏,內(nèi)容四個空格縮進(jìn)缝呕,“^”后帶有參數(shù)時,參數(shù)與“{”之間有一個空格縮進(jìn)
@property (nonatomic ,copy) void (^colorBlock)(UIColor *);
6>方法的聲明和定義
? 在 - OR + 和返回值之間留 1 個空格,方法名和第一個參數(shù)間不留空格
- (void)doSomethingWithString:(NSString *)theString
{
...
}
? 當(dāng)參數(shù)過長時,每個參數(shù)占用一行,以冒號對齊
- (void)doSomethingWith:(GTMFoo *)theFoo
rect:(NSRect)theRect
interval:(float)theInterval
{
...
}
? 如果方法名比參數(shù)名短,每個參數(shù)占用一行,至少縮進(jìn)4個字符,且為垂直對齊
- (void)writeA:(NSString *)firstStr
withBBBBBBBBBBB:(NSString *)nextStr
withCCCCCC:(NSString *)lastStr
{
...
}
? Method與Method之間空一行(官方規(guī)定左括號應(yīng)另起一行)
- (void)samplePrivateMethod
{
...
}
- (void)sampleForIf
{
...
}
7>使用#pragma Mark - 標(biāo)注一類函數(shù)斧散,便于查找
8>注釋問題
? .h和.m 文件注釋:
/* 登陸頁面主頁 ***********************************************************************************************************
- 類名* 建立日期* 版權(quán)聲明作者模塊描述----------------------------------------------------------------* 修改歷史* 序號 日期 修改人 修改原因12 **********************************************************************************************************
*/
? 類和對象方法注釋:
1 /**
2 * @brief 登錄驗證
3 *
4 * @param personId 用戶名
5 * @param password 密碼
6 * @param complete 執(zhí)行完畢的block
7 *
8 * @return
9 */
10 + (void)loginWithPersonId:(NSString *)personId password:(NSString *)password complete:(void (^)(CheckLogon *result))complete;
? 聲明注釋
@property (nonatomic, strong) Student *student; //進(jìn)行單行注釋
采用//進(jìn)行單行注釋供常。所有邏輯判斷需要添加注釋說明。所有變量鸡捐、常量需要添加注釋說明
對 nil 的檢查
? 僅在有業(yè)務(wù)邏輯需求時檢查 nil,而非為了防止崩潰? 向 nil 發(fā)送消息不會導(dǎo)致系統(tǒng)崩潰,Objective-C 運行時負(fù)責(zé)處理
對 BOOL 陷阱
? 禁止將int直接轉(zhuǎn)換(cast or convert)為BOOL 栈暇。Objective-C中,BOOL 被定義為 unsigned char,這意味著除了 YES (1) 和 NO (0)外它還可以是其他 值。? 將整型值轉(zhuǎn)換為 BOOL 的方法:使用三元運算符返回 YES / NO,或使用位運算符 (&&, ||, !)箍镜。
? 禁止將數(shù)組的大小源祈、指針值或位運算符的結(jié)果轉(zhuǎn)換(cast or convert)為 BOOL,因為該 BOOL 值的結(jié)果取決于整型值的最后一位。? 在Objective-C中,只允許使用BOOL? 如:
// 禁止- (BOOL)isBold {
return [self fontTraits] & NSFontBoldTrait;
}
- (BOOL)isValid {
return [self stringValue];
}
// 推薦- (BOOL)isBold {
return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;
}
- (BOOL)isValid {
return [self stringValue] != nil;
}
- (BOOL)isEnabled {
return [self isValid] && [self isBold];
}
? 禁止直接將 BOOL 和 YES/NO 比較,如:
// 禁止
BOOL great = [foo isGreat]; if (great == YES)...// 推薦
BOOL great = [foo isGreat];
if (great)
...
常用的快捷方式
command+r 運行
command+. 停止 死循環(huán)中用到
command+b 編譯 編譯程序不運行
command+z 回退
command+shift+z 前進(jìn)
command+a 全選
command+c v x 復(fù)制 粘貼 剪貼
command+tab 不同程序之間的切換
command+ ~ 相同程序之間切換
command+q 退出
command + shift + J 快速定位當(dāng)前所在文件位置
更多快捷鍵: http://www.cocoachina.com/ios/20160822/17393.html
iOS團(tuán)隊要求
1 刪除多余的空行 * 所有方法與方法之間空1行 * 所有代碼塊之間空1行
2 刪除多余的注釋 * 刪除注釋掉的代碼 * 刪除沒有意義的注釋
3 刪除多余的方法 * 如果方法沒有使用到色迂,請刪除它 * 如果方法沒有執(zhí)行任何業(yè)務(wù)邏輯香缺,請刪除它或者給出一定注釋
4 刪除未被使用的資源文件
5 添加必要的注釋 * 所有 .h 文件中的property 需要給出注釋 * 所有自定義的方法需要給出注釋 * 比較大的代碼塊需要給出注釋 * 所有代碼中出現(xiàn)的阿拉伯?dāng)?shù)字需要給出注釋 * 程序中出現(xiàn)加密/解密 邏輯的操作地方,需要給出注釋說明過程(無論是系統(tǒng)還是自定義)
6 整體代碼風(fēng)格需要統(tǒng)一 * 代碼后面的”{“ 不需要單獨占用一行 * 邏輯運算符 與 代碼之間空一格 * “#pragma mark -” 與下面的代碼之前不要空行 * 遵循一般性的代碼規(guī)范
寫代碼規(guī)范35條小建議: http://www.reibang.com/p/71fdd1ae714c
8>注釋問題
? .h和.m 文件注釋:
/* 登陸頁面主頁 ***********************************************************************************************************
- 類名* 建立日期* 版權(quán)聲明作者模塊描述----------------------------------------------------------------* 修改歷史* 序號 日期 修改人 修改原因12 **********************************************************************************************************
*/
? 類和對象方法注釋:
1 /**
2 * @brief 登錄驗證
3 *
4 * @param personId 用戶名
5 * @param password 密碼
6 * @param complete 執(zhí)行完畢的block
7 *
8 * @return
9 */
10 + (void)loginWithPersonId:(NSString *)personId password:(NSString *)password complete:(void (^)(CheckLogon *result))complete;
? 聲明注釋
`
@property (nonatomic, strong) Student *student; //進(jìn)行單行注釋`
采用//進(jìn)行單行注釋歇僧。所有邏輯判斷需要添加注釋說明图张。所有變量、常量需要添加注釋說明
對 nil 的檢查
? 僅在有業(yè)務(wù)邏輯需求時檢查 nil,而非為了防止崩潰? 向 nil 發(fā)送消息不會導(dǎo)致系統(tǒng)崩潰,Objective-C 運行時負(fù)責(zé)處理
對 BOOL 陷阱
? 禁止將int直接轉(zhuǎn)換(cast or convert)為BOOL 诈悍。Objective-C中,BOOL 被定義為 unsigned char,這意味著除了 YES (1) 和 NO (0)外它還可以是其他 值祸轮。? 將整型值轉(zhuǎn)換為 BOOL 的方法:使用三元運算符返回 YES / NO,或使用位運算符 (&&, ||, !)。
? 禁止將數(shù)組的大小侥钳、指針值或位運算符的結(jié)果轉(zhuǎn)換(cast or convert)為 BOOL,因為該 BOOL 值的結(jié)果取決于整型值的最后一位适袜。? 在Objective-C中,只允許使用BOOL? 如:
// 禁止- (BOOL)isBold {
return [self fontTraits] & NSFontBoldTrait;
}
- (BOOL)isValid {
return [self stringValue];
}
// 推薦- (BOOL)isBold {
return ([self fontTraits] & NSFontBoldTrait) ? YES : NO;
}
- (BOOL)isValid {
return [self stringValue] != nil;
}
- (BOOL)isEnabled {
return [self isValid] && [self isBold];
}
? 禁止直接將 BOOL 和 YES/NO 比較,如:
// 禁止
BOOL great = [foo isGreat]; if (great == YES)...// 推薦
BOOL great = [foo isGreat];
if (great)
...
常用的快捷方式
command+r 運行
command+. 停止 死循環(huán)中用到
command+b 編譯 編譯程序不運行
command+z 回退
command+shift+z 前進(jìn)
command+a 全選
command+c v x 復(fù)制 粘貼 剪貼
command+tab 不同程序之間的切換
command+ ~ 相同程序之間切換
command+q 退出
command + shift + J 快速定位當(dāng)前所在文件位置
[更多快捷鍵](http://www.cocoachina.com/ios/20160822/17393.htm)
----
iOS團(tuán)隊要求
1 刪除多余的空行 * 所有方法與方法之間空1行 * 所有代碼塊之間空1行
2 刪除多余的注釋 * 刪除注釋掉的代碼 * 刪除沒有意義的注釋
3 刪除多余的方法 * 如果方法沒有使用到,請刪除它 * 如果方法沒有執(zhí)行任何業(yè)務(wù)邏輯慕趴,請刪除它或者給出一定注釋
4 刪除未被使用的資源文件
5 添加必要的注釋 * 所有 .h 文件中的property 需要給出注釋 * 所有自定義的方法需要給出注釋 * 比較大的代碼塊需要給出注釋 * 所有代碼中出現(xiàn)的阿拉伯?dāng)?shù)字需要給出注釋 * 程序中出現(xiàn)加密/解密 邏輯的操作地方珍策,需要給出注釋說明過程(無論是系統(tǒng)還是自定義)
6 整體代碼風(fēng)格需要統(tǒng)一 * 代碼后面的”{“ 不需要單獨占用一行 * 邏輯運算符 與 代碼之間空一格 * “#pragma mark -” 與下面的代碼之前不要空行 * 遵循一般性的代碼規(guī)范
[寫代碼規(guī)范35條小建議](http://www.reibang.com/p/71fdd1ae714c)