oc的代碼規(guī)范大抵都是一樣的,重要的是執(zhí)行夜惭。正常review兩三個版本就可以在團隊內(nèi)部形成統(tǒng)一的風格岖食。當然這些規(guī)范也可能隨著成員認知的變化而發(fā)生變化,沒必要教條假丧。
語言規(guī)范
-
[強制]命名規(guī)范
-
[強制]命名約定通 準則:清晰双揪、 一致性。
- 清晰:命名應(yīng)該既清晰 簡短包帚,但拒絕為 追求簡短 喪失清晰性渔期,拒絕為 簡潔進 隨意縮寫。
- 一致性:命名含義應(yīng)該具有前后渴邦,全局的一致性疯趟,同個功能也應(yīng)該使 同個名稱。
-
[強制]盡量不用縮寫谋梭,除以下已經(jīng)長期使用形成共識的內(nèi)容信峻。
命名 說明 alloc allocate dealloc dealloc info information init initialize min minimum max maximum temp temporary int integer msg message -
[強制]禁止使用系統(tǒng)前綴開頭,以防止沖突瓮床,原則上兩字母前綴都是系統(tǒng)保留前綴盹舞,盡量使用三個字符最為前綴。
-
[強制]方法名隘庄、參數(shù)名踢步、成員變量、局部變量都采小寫字符開頭丑掺,駝峰命名法获印。
-
[強制]如果方法代表執(zhí)行某個動作,應(yīng)該以動詞開頭街州。
-
[強制]如果方法返回某個屬性兼丰,應(yīng)該直接以屬性作為方法名玻孟,只有當間接返回對象或返回多個對象時,可以使 get鳍征。
-
[建議]同一個類的一系列相關(guān)方法命名應(yīng)該有一致性黍翎,入?yún)⒏嗟姆椒☉?yīng)該在入?yún)⒏俚姆椒竺嬖黾有玛P(guān)鍵字。
如: - (instancetype)initWithURL:(NSURL *)URL; - (instancetype)initWithURL:(NSURL *)URL cachePolicy:(NSURLRequestCachePolicy)cachePolicy
-
[建議]動詞前可以根據(jù)具體情況增加 can, should, will等 情態(tài)動詞使方法更明確蟆技。
-
[強制]不要使用一到兩個字符的名稱玩敏。
-
[建議]delegate方法名稱的開頭應(yīng)標識出發(fā)送消息的對象所屬的類。
如: - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
-
-
常量定義
-
[強制]使用NS_ENUM聲明枚舉類型质礼,枚舉項以枚舉類型為前綴旺聚。
typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { UIViewAnimationCurveEaseInOut, UIViewAnimationCurveEaseIn, UIViewAnimationCurveEaseOut, UIViewAnimationCurveLinear, };
-
[強制]使用NS_OPTIONS聲明位移枚舉常 ,位移枚舉常量可以組合使用眶蕉。
typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutoresizingFlexibleWidth = 1 << 1, UIViewAutoresizingFlexibleRightMargin = 1 << 2, UIViewAutoresizingFlexibleTopMargin =1<<3, }
-
[強制]通常情況下砰粹, 不要使用宏創(chuàng)建數(shù)值和字符串常量,使 static聲明變量造挽,并在頭文件中以extern的方式暴露給外部碱璃。
如: .m : NSString * const AFNetworkingReachabilityNotificationStatusItem = @"AFNetworkingReachabilityNotificationStatusItem" .h : extern NSString * const AFNetworkingReachabilityNotificationStatusItem;
-
[強制]Notification消息使用全局的NSString對象進行標識,名稱按如下方式組合:
[Name of assoicated class] + [Did|Will] + [Unique part of name] + Notification 如: UIApplicationDidEnterBackgroundNotification
-
-
類定義
-
[強制]使用property代替成員變量饭入。
-
[建議]需要時在property聲明自定義getter或setter嵌器。
@property(nonatomic, getter=isHidden) BOOL hidden;
-
[強制]需要對外公開的聲明放在.h中,其他都放在.m中谐丢。
-
[強制]+ (void)initialize必須判斷class類型爽航,因為任何繼承類也會執(zhí)行父類的initialize。
+ (void)initialize { if (self == [ClassName class]) { // ... do the initialization ... } }
-
[建議]使用nonnull, nullable, __kindof等 來修飾入?yún)⑶馈⒎祷刂导フ洹傩浴?/h6>
-
[建議]使 designated initializer指定初始化方法:
- designated initializer提供所有參數(shù),secondary initializer提供一些默認參數(shù)來調(diào)用designated initializer窄瘟。
- 一個類最好有一個designated初始化方法衷佃,其他初始化方法應(yīng)該調(diào)用該方法。
- 繼承時應(yīng)該注意:
a. 子類designated應(yīng)該調(diào)用直接父類的designated initializer方法蹄葱。
b. 重載直接父類的designated initializer氏义,調(diào)用你的designated initializer。
c. 可以 __attribute((unavailable)) 標記不可用的父類designated initializer图云。
如: - (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
-
-
注釋
-
[建議]使 Xcode自帶工具插入默認格式惯悠,Option+Command+/即可自動插入。
-
[建議]復(fù)雜難懂的邏輯添加注釋琼稻。
-
[建議]公共類頭文件中暴露的方法都應(yīng)該添加注釋吮螺。
-
-
代碼組織
-
[建議] 一個類功能較多時饶囚,可以使用Category的方式進行功能劃分帕翻,這些Category可以放在同一個文件中鸠补。
-
[建議]使 #pragma marks - 進行方法分組。
-
[強制]合理使用group或folder組織工程結(jié)構(gòu)嘀掸,文件folder結(jié)構(gòu)和工程group結(jié)構(gòu)要對應(yīng)紫岩。
-
[建議]過期方法不要直接刪除,先標記為deprecated睬塌。
-
[建議]函數(shù)內(nèi)嵌套不要太深泉蝌,大括號嵌套大括號不要超過三層。
-
-
Switch
-
[強制]Switch一定要實現(xiàn)default揩晴,防止case側(cè)漏處理勋陪。
-
[強制]每個case必須寫break。
-
[強制]每個case不管多少硫兰, 用大括號括起來诅愚。
-
工程規(guī)范
-
CocoaPods使用規(guī)范
-
[強制]Podfile.lock文件必須提交到git版本控制,以保證版本可回溯劫映。
-
[強制]Podfile中必須指定三方庫的版本或SHA值违孝,以防意外更新。
-
[強制]區(qū)分pod install和pod update的使用場景泳赋,默認使用pod install雌桑。
-
[強制]開發(fā)pod庫在提交repo前,本地進行l(wèi)int校驗祖今。
-
-
Git使用規(guī)范
-
[強制]本地分支提交前校坑,使 git pull --rebase將本地分支進行rebase。
-
[強制]使用gitlab上的用戶名和郵件衅鹿,不要有多套用戶名和郵件撒踪。
$ git config --global user.name "輸入你的名字" $ git config --global user.email abc@example.com
-
最佳實踐
-
多線程
-
[強制]創(chuàng)建線程必須命名。
-
[強制]單例創(chuàng)建要使用dispatch_once確保線程安全大渤。
-
[強制]在多線程環(huán)境下使用lazy load方式加載變量有crash風險制妄,必須加鎖保護
-
[強制]performSelector:withObject:afterDelay:要在有Runloop的線程調(diào)用,否則無效泵三。
-
[強制]禁止隨意創(chuàng)建常駐線程耕捞,除非在整個App 命周期有必要且有任務(wù)運行。
-
[強制]Notification在哪個線程中post烫幕,就在哪個線程中被轉(zhuǎn)發(fā)俺抽,如果有UI操作,注意dispatch到主線程较曼。
-
[強制]禁止在主線程進 文件IO操作磷斧,必須異步處理。
-
[強制]剪貼板讀取必須放在異步線程處理。
-
-
內(nèi)存管理
-
[建議]慎重使用單例弛饭,避免造成不必要的常駐內(nèi)存冕末。
-
[強制]Delegate需要使用weak引用。
-
[強制]使用block訪問self時侣颂,使用weakify和strongify避免Retain Cycle档桃。
-
[強制]strong引用子對象,weak引用父對象憔晒,基礎(chǔ)類型使 assign藻肄,NSString、NSArray拒担、block使用copy嘹屯。
-
[強制]在dealloc 法中remove observer。
-
[強制]指定repeat參數(shù)是YES的timer从撼,必須在合適的時機調(diào)用invalidate方法抚垄。
-
[強制]在init和dealloc中除非類屬性外,禁止使用self訪問屬性谋逻,只允許通過成員變量直接訪問呆馁。
- 在init和dealloc截斷,self是一個不完整的對象毁兆。
- 子類可以重寫accessor方法浙滤,在某些情況下可能導致異常。
-
[強制]在使用到UIScrollView气堕,UITableView纺腊,UICollectionView的class中,需要在dealloc中將 delegate茎芭,dataSource置為nil揖膜。
-
[強制]禁止一次性申請超過10MB的內(nèi)存。
-
-
集合
-
[強制]插入對象和使用literals需要做 非空判斷梅桩。
-
[強制]注意線程安全問題壹粟,必要時加鎖,保障線程安全宿百。
-
[強制]遍歷可變集合時趁仙,先copy,再遍歷臨時變量垦页。
-
[強制]禁止mutable對象作為入?yún)鬟f雀费,禁止返回mutable對象。
-
[建議]使用NSCache 而不是NSMutableDictionary作為緩存痊焊。
-
[建議]容器使用泛型指定對象類型盏袄。
NSArray <NSString *> *stringArray;
-
-
字符串
-
[建議]使用keypath時忿峻,盡量使用NSStringFromSelector(@selector()),防止某個屬性被刪除后沒有編譯器檢查辕羽。
-
[建議]取substring時考慮emoji字符問題炭菌,防止截到中間crash。
(參見:http://blog.csdn.net/liu1347508335/article/details/52484507)
-
-
鎖
-
[強制]專鎖專用逛漫,一個lock對象只負責 一個任務(wù)。
-
[建議]根據(jù)不同使用場景和性能要求赘艳,使用不同類型的鎖酌毡。
-
[強制]使用鎖return前,記得unlock蕾管,如果在try catch中枷踏,記得在finally中unlock。
-
-
IO
-
[建議]經(jīng)常被讀取的文件做好內(nèi)存緩存掰曾,減少IO開銷旭蠕。
-
[強制] 文件存儲路徑遵守以下規(guī)則:
- Documents 錄:存儲用戶數(shù)據(jù),該路徑可以通過iTunes存取旷坦,會被iTunes備份掏熬。
- Library 錄:
a. Preferences目錄:包含應(yīng)用程序偏好設(shè)置文件。
b. Caches目錄:存放緩存信息秒梅, 不會被備份旗芬。
c. tmp目錄:存放臨時文件,不會被備份捆蜀。
d. 創(chuàng)建其他目錄:放置不希望被用戶看到的數(shù)據(jù)疮丛,會被備份。
-
-
Category
-
[強制]category方法加上 定義前綴辆它,防止沖突覆蓋誊薄。
-
[強制]禁 category 法覆蓋系統(tǒng)方法。
-