iOS 編碼規範
Objective-C 是一門面向物件的動態程式語言,主要用於編寫 iOS 和 Mac 應用程式。關於 Objective-C 的編碼規範,蘋果和谷歌都已經有很好的總結:
Cocoa%2FConceptual%2FCodingGuidelines%2FCodingGuidelines.html" rel="nofollow,noindex">Apple Coding Guidelines for Cocoa Line_Length%23Line_Length" rel="nofollow,noindex">Google Objective-C Style Guide
本文主要參考了對上述文件的翻譯、查閱其他的相關資料和經過公司 iOS 小組的深刻討論,為公司 iOS 小組總結出一份通用的編碼規範
命名規範
- 基本原則
駝峰命名(特殊除外)
followAnchorButton 複製程式碼
儘可能清晰,儘量不使用縮寫,建議使用完整單詞
// 建議 setBackgroundColor headImageView settingButton // 不建議 setBkgColor headImg setBtn 複製程式碼
- 命名類
使用字首:類字首一般為專案名稱縮寫開頭大寫字母
字首 + 描述 + 型別
//SuperTA |- STLoginViewController |- STUserInfoModel |- STHomeTableCell |- STCenterTableHeaderView 複製程式碼
- 命名方法
按照蘋果的說法“好的方法名應當可以以一個句子的形式朗讀出來”
一般以小寫字母開頭,每一個後續的單詞首字母大寫
// 動詞開頭的方法表示讓物件執行一個動作 - (void)invokeWithTarget:(id)target; 複製程式碼
- 命名屬性
屬性同樣遵循第一個字母小寫,後續單詞首字母大寫,同時不必新增字首,採用非原子性 nonatomic + 對應記憶體管理方式關鍵字(這裡不盡描述)進行修飾
在(nontomic,
後新增空格,在NSString
和*
前面均有空格,在*
後面不需要空格!
// 建議 @property (nonatomic, copy) NSString *userName // 不建議 @property (nonatomic,copy)NSString * userName 複製程式碼
- 命名例項變數
命名例項變數,在變數名前加上_
字首,其他和命名屬性一樣,建議 BOOL 型別的例項變數採用_is
開頭
@implementation simpleClass { BOOL _isShowVip; NSString *_uploadImageUrlString } 複製程式碼
- 命名協議
當前類類名 + Delegate
// STCenterHeaderView @protocol STCenterHeaderViewDelegate <NSObject> 複製程式碼
- 協議方法
去掉專案大寫字首的協議名前面部分+具體方法命名
// STCenterHeaderViewDelegate - (void)centerHeaderButtonClickWithTag:(NSInteger)tag 複製程式碼
- RAC 的命名 呼叫 RAC 的時候,可以把所有方法實現在一個基礎方法中
- (void)pickRac; 複製程式碼
class 結構
為明確區分 class中方法型別,使 class 結構更清晰,最快定位到指定方法,特別是在 Controller 中,一旦邏輯稍微複雜,不熟悉程式碼很難一下子找到。so,這裡從幾個部分劃分成幾個模組,並儘量使用以下順序。在每部分方法前用pragma mark - <#object#>
註釋
#pragma mark - life cycle// class 生命週期 #pragma mark - set & get // setter & getter 方法 #pragma mark - request// 網路請求 #pragma mark - notification//通知 #pragma mark - action // 事件處理(例:按鈕點選事件) #pragma mark - delegate// 代理方法 #pragma mark - setupUI // UI 相關 #pragma mark - lazy load// 懶載入 #pragma mark - delloc 複製程式碼
程式碼格式
- 方法書寫
一個典型的 Objective-C 方法應該是這樣的:
- (void)uploadImage:(UIImage *)image withToken:(NSString *)token linkAddress:(NSString *)linkAddress { } 複製程式碼
在-
和(void)
之間應該有一個空格,第一個大括號{
單獨佔一行。
- 方法呼叫
注意一點是如果方法有多個引數或者方法過長,那麼應該按照:
來對其分行顯示
[self uploadImage:image withToken:token linkAddress:linkAddress]; 複製程式碼
- 協議 Protocols
在一個頭檔案中正確定義一個協議的如下
@class
引用當前類
<>
中的協議和型別名之間不
需要新增空格
預設對協議方法不寫修飾符@required
@optional
,即預設為@required
,但特殊情況下協議方法不要求必須實現的,使用@required
修飾協議方法
協議屬性使用weak
關鍵字修飾,並且一般統一命名為delegate
#import <UIKit/UIKit.h> @class STMyWalletHeaderView; @protocol STMyWalletHeaderViewDelegate<NSObject> @optional /** 1-提現 2充值 */ - (void)myWalletHeaderButtonClickWithTag:(NSInteger)tag; @end @interface STMyWalletHeaderView : UIView @property (nonatomic, weak) id<STMyWalletHeaderViewDelegate> delegate; @end 複製程式碼
專案規範
- MVC 設計模式
- UI 控制元件使用懶載入初始化
建議在整個專案中使用懶載入進行初始化,在初始化中定義好屬性(例如定義好 UIButton 控制元件的屬性),如果控制元件預設會顯示在 view 上面則在懶載入中通過 addSubView 新增到 view ,使整個類檔案程式碼更加清晰明朗。
例子:充值按鈕的懶載入
-(UIButton *)rechargeButton { if (!_rechargeButton) { _rechargeButton = [UIButton buttonWithTitle:@"充值" atTitleSize:15 atTitleColor:White_Color atTarget:self atAction:@selector(buttonClick:)]; _rechargeButton.backgroundColor = Main_Color; _rechargeButton.tag = 2; _rechargeButton.layer.masksToBounds = YES; _rechargeButton.layer.cornerRadius = 18; [self addSubview:_rechargeButton]; } return _rechargeButton; } 複製程式碼
- Masonry 自動佈局
建議在setSubLayouat
方法中進行自動佈局,在 viewDidLoad 中呼叫該方法
#pragma mark -- 佈局 -(void)setSubLayout { [self.whiteView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.offset(10); make.left.offset(16); make.right.offset(-16); make.height.offset(216); }]; [self.subLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.offset(30); make.height.offset(38); make.right.equalTo(self.thireLabel.mas_left).offset(-4); }]; } 複製程式碼
- 列舉定義型別常量
如果要定義一組相關的常量,儘量使用列舉型別(enumerations),列舉型別的命名規則和函式的命名規則相同,建議使用NS_ENUM
和NS_OPTIONS
巨集來定義列舉型別
從 1001 開始,根據蘋果官方解釋,0~1000 為蘋果 SDK 使用
typedef NS_ENUM(NSInteger, ImagePickState){ ImagePickStateNormal = 1001, // 系統自帶 ImagePickStateTZI // TZimagePick }; 複製程式碼
- 一般使用 Delegate 傳值
在介面傳值、監聽狀態等均建議統一使用 Delegate
註釋規範
- 方法註釋 快捷鍵 : Command + Option + /
/** 載入全景圖片 @param imageName 全景圖圖片名稱 */ - (void)setImageWithName:(NSString *)imageName; 複製程式碼
- 屬性註釋
/** 建立時間 */ @property (nonatomic, copy) NSString *createTime; 複製程式碼
- 使用 #pragma mark - 區分方法
- 其他
為了別給自己埋坑,或者給後人留條路走,強烈要求在寫邏輯,特別是複雜邏輯的時候要寫好註釋。
工程規範
- 目錄結構
類檔案除 AppDelegate 、man.h 外,其他均在 Classes 資料夾中,以模組劃分,模組下面分別以 Model 、 View 、Controller 劃分不同資料夾
例:
| — Classes | — Main[基礎框架] | — Home[首頁模組] | — Model | — View | — Cell | — Controller | — Attention[關注模組] | — Message[訊息模組] | — Center[個人中心模組] | — Login[登入註冊模組] 複製程式碼
- 圖片資源
圖片資源統一放在 Assets.xcassets 中,並根據模組區分存放不同資料夾