iOS 開發規範
以MVC開發模式為主,根據子產品化+MVC思想
一.子產品化思想建立目錄路徑(建立真實路徑,再拖到項目中不要直接建立Group)
M —— 模型,模型對象封裝了應用程式的資料,并定義操控和處理該資料的邏輯和運算。
V —— 視圖,顯示資料,是應用程式中使用者可以看見的對象。
C —— 控制器,在應用程式的一個或多個視圖對象和一個或多個模型對象之間,控制器對象充當媒介。
SupportingFiles中主要放一下配置檔案和頭檔案
EnumHeader — 主要存放枚舉,這裡枚舉的寫法必須用OC的寫法,禁止用c的寫法
StringHeader — 主要存放title字元串(如:提示語/控制器标題等字元串資訊)
CommonHeader — 主要存放公共的配置資訊(如:宏定義/基礎設定等)
ApiHeader — 主要存放接口參數
二.基礎設定
1.xcode設定 螢幕左上角Xode->Perference->Text Editing->”Page guide at column: 80” 打上勾;每一行的代碼盡量不要超出80個字的長度,超出的回車排版, 方法名的冒号對齊
2.xcode設定 螢幕左上角Xode->Perference->Text Editing->Indentation,将Tab改成Spaces,并将Tab width和indent width設為4個空格
3.項目名稱使用英文
三.規範命名(駝峰法)
1.類命名
采用項目名簡稱+功能命名方式.首字母大寫,每個單純首字母大寫,盡量使用能夠反應類功能的名詞短語
eg: CRMApplicationController, CRMUserManage, CRMUserData
2.特殊類命名
UIKit裡的UI界面部分
控件類型直接使用尾端的駝峰單詞
eg: UIView —> xxxView
UIViewController —> xxxController
UIButton —> xxxButton
UILabel —> xxxLabel
UITableViewCell —> xxxCell
3.分類(類别)命名
與類命名相同,此外需添加擴充類名”+”
eg: NSString + Login
-
協定(委托)命名
與類命名相同,此外需添加’Delegate’字尾
eg: RMUserInfo 對 RMUserInfoDelegate
5.通知命名
通知常用于在子產品間傳遞消息,是以通知要盡可能地表示出發生的事件,通知的命名範式:[ 觸發通知的類名 ] + [Did | Will] + [ 動作 ] + Notification
eg: UIApplicationUserDidTakeScreenshotNotification
6.常量的命名最好在前面加上字母k作為标記.(全局常量(通知或者關鍵字等)盡量用const來定義. 因為如果使用宏定義, 一來宏可能被重定義. 二來引用不同的檔案可能會導緻宏的不同) 如:
(1) 定義常量
static const NSTimeInterval kAnimationDuration = 0.3;
(2).盡量使用OC的定義方式,避免C的定義方式.(命名:枚舉類型命名要加相關類名字首并且枚舉值命名要加枚舉類型字首)如:
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
};
(3).變量和對象的命名采用修飾+類型的方式,如:
UILabel *titleLabel;
UIButton *confirmButton;
UIArray *modelArray;
7.執行個體變量聲明時變量名前面加下劃線“_”
UILabel _titleLabel;
8.方法命名
(1).方法一般以小寫字母打頭,每一個後續的單詞首字母大寫,方法名中不應該有标點符号(包括下劃線),有兩個例外:
a.可以用一些通用的大寫字母縮寫打頭方法,比如 PDF,TIFF 等。
b.可以用帶下劃線的字首來命名私有方法或者類别中的方法。
(2).如果方法是為了擷取對象的一個屬性值,直接用屬性名稱來命名這個方法,注意不要添加 get 或者其他的動詞字首:如:
// 正确,使用屬性名來命名方法
- (NSSize)cellSize;
// 錯誤,添加了多餘的動詞字首
- (NSSize)calcCellSize;
(NSSize)getCellSize;
(3).對于有多個參數的方法,務必在每一個參數前都添加關鍵詞,關鍵詞應當清晰說明參數的作用:如:
// 正确,保證每個參數都有關鍵詞修飾
- (void)sendAction:(SEL)aSelector toObject:(id)anObject forAllCells:(BOOL)flag;
// 錯誤,遺漏關鍵詞
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;
// 正确
- (id)viewWithTag:(NSInteger)aTag;
// 錯誤,關鍵詞的作用不清晰
(id)taggedView:(int)aTag;
(4).不要用 and 來連接配接兩個參數,通常 and 用來表示方法執行了兩個相對獨立的操作(從設計上來說,這時候應該拆分成兩個獨立的方法):
// 錯誤,不要使用 “and” 來連接配接參數
- (int)runModalForDirectory:(NSString )path andFile:(NSString )name andTypes:(NSArray *)fileTypes;
// 正确,使用 “and” 來表示兩個相對獨立的操作
- (BOOL)openFile:(NSString )fullPath withApplication:(NSString )appName andDeactivate:(BOOL)flag;
*方法的參數命名也有一些需要注意的地方 :
和方法名類似,參數的第一個字母小寫,後面的每一個單詞首字母大寫
不要再方法名中使用類似 pointer,ptr 這樣的字眼去表示指針,參數本身的類型足以說明
不要使用隻有一兩個字母的參數名
不要使用簡寫,拼出完整的單詞
不适用 get 字首來表示屬性擷取方法
8.宏定義必須使用大寫命名,使用_隔開
eg: SCREEN_WIDTH
9.其他方法命名方法以類名+功能為基準
四.編碼規範
1.判斷語句(格式和判斷方式)
Preferred:
if (someObject) {
…
}
if (!someObject) {
…
}
Not preferred:
if (someObject == YES)
{
...
}
if (someObject != nil)
{
...
}
2.初始化推薦使用文法糖方式
數組@[@”“,@”“]
字典@{@”“:@”“,@”“:@”“}
3.回調方法(函數調用的可知性, 回調時被調用者要知道其調用者, 友善資訊的傳遞, 是以建議在回調方法中第一個參數中加上調用者)
- (UITableViewCell )tableView:(UITableView )tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
4.函數書寫
‘-’後面有個空格,第一個大括号‘{’的位置在函數所在行的末尾,同樣應該有一個空格,如果傳遞參數類型是指針,類與*号之間要有空格
eg: - (void)applicationDidEnterBackground:(UIApplication *)application {
}
5.邏輯運算符與代碼之間空一格
eg: a ++, a + b,
6.注釋(推薦使用VVDocumenter插件)
(1).所有接口類(.h)必須給出必要的注釋(接口用’//’,方法用插件’///’功能)
(2).工具類方法必須寫出明确注釋
(3).删除不必要注釋,更改代碼後及時更新注釋
(4).删除注掉的代碼和沒有意義的注釋
(5).用pragma mark - 來區分不同方法子產品
五. 注意(開發提示)
1.如果用到了Observer,至少要在dealloc裡移除掉(如果是在ARC中使用,不用調用super方法)
2.當用到addObject或insertObject時注意對NSArray,NSDictionary成員的判空保護
3.加上必要注釋(推薦安裝 VVDocumenter,進行注釋)
4.寫delegate的時候類型應該為weak弱引用,以避免循環引用
5.在适當的位置建議加上#pragma mark ,便于閱讀代碼
6.引入第三方盡量使用cocoaPod
7.不用使用new方法,盡量使用alloc init方法(因為new會在調試記憶體是出現不可預料問題,也會使人困惑)
8.NSString使用 copy屬性
9.避免相同代碼段在多個地方出現,相同代碼必須歸納出來,有必要的可以用類進行封裝
10.語句嵌套層次不得超過3層,超出的必須抽離出中間函數