iOS開發(fā)規(guī)范(OC,詳細版)

前言


本文是作者參考自己的部分代碼規(guī)范和網上眾多其它小伙伴的代碼規(guī)范,整理和寫出的。
規(guī)范涵蓋了很多內容,閱讀的小伙伴多點耐心哈。
By:申自禮

目的


為了利于項目維護以及規(guī)范開發(fā),促進成員之間Code Review的效率,故提出以下開發(fā)規(guī)范,如有更好的建議,歡迎提出。
本文檔的預期讀者包括:iOS開發(fā)人員。

命名規(guī)范


代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文的方式。正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義。
*注意:即使純拼音命名方式也要避免采用。但alibaba、taobao、youku、shanghai等國際通用的名稱,可視同英文.

大駝峰規(guī)則:每個單詞的首字母大寫。例:NameTextField。
小駝峰原則:第一個單詞首字母小寫,其余都大寫。例:nameTextField。

項目命名 && 文件命名

項目名和文件名都遵循大駝峰命名。例如:CWBusinessZongBu、CarWins-Group。

Bundle Identifier 命名

Bundle Identifier:采用反域名命名規(guī)范,以域名后綴(小寫com)+公司頂級域名(小寫carwins)+應用名(總部ZongBu駝峰命名方式)形式命名,例如:com.carwins.ZongBu

類名

類的命名都遵循大駝峰命名。一般是:前綴 + 功能 + 類型。例如:CW + Login + ViewController

在實際開發(fā)中,一般都會給工程中所有的類加上屬于本工程的前綴。

常用控件類命名類型對照表(下表中前綴為:CW,如果用到下表中沒有列舉出來,請去掉UI首字母,遵循實際規(guī)則即可。)

控件名 類型 示例
UIViewController ViewController、VC CWBaseViewController
UView View CWBaseView
UITableView TableView CWOrderTableView
UITableViewCell Cell CWOrderListCell
UIButton Button、Btn CWSuccessButton
UILabel Label、Lab CWSuccessLabel
UIImageView ImgView CWGoodsImgView
UITextField TextField CWNameTextField
UITextView TextView CWSuggestTextView

其它類相關對照表

功能 類型 示例
工具類 Tool CWOrderTool
代理類 Delegate CWOrderListDelegate
管理類 Manager CWOrderListModel
模型類 Model CWOrderListModel
Service類 Service CWOrderService
布局類 Layout CWHomeLayout
數(shù)據(jù)庫類 DataBase、表名+DBHelper CWFriendDataBase、CWUserTableDBHelper
類目 XXX+(范圍,例如Extension, Additions 或者功能,例如Frame,Nib,Block) CWUIButton+Additions、CWUIButton+Block

UIViewController請按照如下分類

#pragma mark - life cycle
#pragma mark - event response
#pragma mark - UITableViewDelegate && UITableViewDataSource
(代理順序往下排列)
#pragma mark - getters and setters
#pragma mark - private

注意:所有視圖或者對象的創(chuàng)建請盡量使用懶加載,調用的時候全部使用self.textBtn這樣的方式。如果是確定的不可變數(shù)組、字典,可直接給定數(shù)組中的元素。(getters and setters分類中,懶加載可出現(xiàn)_調用對象,其它情況請遵循self.調用原則)

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic, strong)UIButton * textBtn;
@end

@implementation ViewController

#pragma mark - life cycle
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.textBtn];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
#pragma mark - private 

#pragma mark - event response

#pragma mark - UITableViewDelegate && UITableViewDataSource
//(代理順序往下排列)

#pragma mark - CTAPIManagerCallBackDelegate

#pragma mark - getters and setters
- (UIButton *)textBtn
{
    if (_textBtn == nil) {
        _textBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        _textBtn.frame = CGRectMake(300, 250, 100, 100);
        _textBtn.backgroundColor = [UIColor yellowColor];
        _textBtn.titleLabel.text = @"text";
        [_textBtn addTarget:self action:@selector(text) forControlEvents:UIControlEventTouchUpInside];
    }
    return _textBtn;
}
@end

變量和方法

變量和方法的命名都遵循小駝峰命名。例如:textVariableStr, - (void)textAction響應事件。
變量命名對照表(如果用到下表中沒有列舉出來,請去掉UI、NS遵循實際規(guī)則即可?;蛘咭豢淳椭赖耐ㄓ煤唽懀?br> 方法命名對照表(方法多為動詞或動名詞)

功能 示例
- (id)initXX 初始化相關方法,使用init為前綴標識,如初始化布局- (id)initView
- (BOOL)isXX 方法返回值為boolean型的請使用is前綴標識
- (UIView *)getXX 返回某個值的方法,使用get為前綴標識
- (void)setXX 設置某個屬性值或者相關數(shù)據(jù)
- (void)updateXX 更新數(shù)據(jù)
- (void)saveXX 保存數(shù)據(jù)
- (void)drawXX 繪制相關,使用draw前綴標識
- (void)clearXX 清除數(shù)據(jù)
- (void)XXXAction 響應事件,使用Action為后綴標識
- (void)loadData 加載數(shù)據(jù)(一般情況下VC中都會有這個方法)
- (void)loadMoreData 加載更多數(shù)據(jù)
- (void)setupUI 加載布局(一般情況下VC中都會有這個方法)

常量

宏:小寫k+大駝峰 即為:#define kUserAgeKey @“ageKey”
全局常量:工程前+綴全大寫,下劃線隔開 即為:extern const NSString CW_USER_AGE_KEY

參數(shù)名

參數(shù)名以小駝峰命名,盡量參考蘋果原生方法風格編寫。盡量可讀性好,看到方法名就知道這個方法是用來干什么的。參數(shù)應該避免用單個字符命名。例:- (void)setDataImageUrl:(NSString *)imageUrl name:(NSString *)nameStr content:(NSString *)contentStr

資源文件規(guī)范


資源文件命名

全部小寫,采用下劃線命名法,加前綴區(qū)分。所有的資源文件都需要加上工程前綴(小寫形式)
命名模式:可加后綴_small表示小圖,_big表示大圖,邏輯名稱可由多個單詞加下劃線組成,采用以下規(guī)則:
用途_模塊名_邏輯名稱
用途_模塊名_顏色
用途_邏輯名稱
用途_顏色

說明 前綴(工程前綴示例CW) 示例
按鈕相關 cw_btn_ cw_btn_home_normal、cw_btn_red,cw_btn_red_big
背景相關 cw_btn_ cw_bg_home_header、cw_bg_main
圖標相關 cw_ic_ cw_ic_home_location、cw_bg_input
分割線相關 cw_div_ cw_ic_home_location、cw_bg_input
默認相關 cw_def_ cw_ic_home_location、cw_bg_input

文件夾命名

創(chuàng)建文件夾最好創(chuàng)建實體文件夾,找到工程目錄,創(chuàng)建相應文件夾并拖入工程。文件夾命名使用相應模塊結構分層的英文,首字母要大寫。例:Model,View,Controller,Tool,Other,Service等等。

版本規(guī)范


采用A.B.C 三位數(shù)字命名,比如:1.0.2,當有版本更新的時候,依據(jù)下面的情況來確定版本號規(guī)范。

版本號 說明 示例
A.b.c 屬于重大更新內容 1.0.2 -> 2.00
a.B.c 屬于小部分更新內容 1.0.2 -> 1.2.2
a.b.C 屬于補丁更新內容 1.0.2 -> 1.0.4

第三方庫規(guī)范


希望Team能用時下較新的技術,對開源庫的選取,一般都需要選擇比較穩(wěn)定的版本,作者在維護的項目,要考慮作者對issue的解決,以及開發(fā)者的知名度等各方面。選取之后,一定的封裝是必要的。

項目使用cocoapods統(tǒng)一管理開源第三庫文件,不需要手動導入和手動添加依賴庫。如果第三方不支持cocoapods,可手動導入工程。安裝cocoapods請移步這里cocoapods安裝

注釋規(guī)范


為了減少他人閱讀你代碼的痛苦值,請在關鍵地方做好注釋。

類注釋

//
//  MyViewController.m
//  text
//
//  Created by 林亦辰 on 2017/2/22.
//  Copyright ? 2017年 iOSShen. All rights reserved.
//

該注釋是自動生成的,在xcode中設置即可。Created by 電腦用戶名on 創(chuàng)建該文件的時間。Copyright 2017 后面的名字和郵箱是自己填寫和設置的。具體可在xcode工程,Project Document中設置。這樣便可在每次新建類的時候自動加上該頭注釋。

方法注釋

方法注釋,方法外部統(tǒng)一用option + command + /,方法內部統(tǒng)一用//注釋。

/**
 測試
 */
- (void)text
{
    //測試按鈕事件響應
}

模型注釋

每個model中的,包含的每個屬性,都必須要寫上相對應的注釋,用///注釋。閱讀者一看這個model,就清楚知道model中的每個字段代表的意思,用來做什么事情的。

@interface DeliveryModel : NSObject
///提貨劵所在商圈id
@property (nonatomic, assign) long long mallId;
///商圈全稱
@property (nonatomic, copy) NSString *mallFullName;
///商圈簡稱
@property (nonatomic, copy) NSString *mallShortName;
///提貨劵號
@property (nonatomic, copy) NSString *credentialsCode;
///總金額
@property (nonatomic, assign) NSInteger totalAmount;
///提貨劵所在店鋪id
@property (nonatomic, assign) long long storeId;
///貨劵所在店鋪名稱
@property (nonatomic, copy) NSString *storeName;
///提貨劵id
@property (nonatomic, strong) NSNumber *credentialsId;
///狀態(tài):0:未提貨、1:已提貨、2:已分享、3:已退款
@property (nonatomic, assign) NSInteger state;
///提貨商品(以下為提貨商品參數(shù))
@property (nonatomic, strong) NSArray<DeliveryGoodslist *> *goodsList;
///二維碼
@property (nonatomic, copy) NSString *qrCode;
///商品總個數(shù)
@property (nonatomic, assign) NSInteger goodsCount;
@end

如果不是model的屬性,是其它類屬性,需要注釋,請按照model屬性注釋方式。

編碼規(guī)范


  • 所有的方法之間空一行。
  • 所有的代碼塊之間空一行,刪除多余的注釋。
  • 所有自定義的方法需要給出注釋。
  • 盡量使用懶加載,在控制器分類時有提及和要求,其它自定義類按照控制器格式分類,沒有的分類不寫即可。
  • 代碼后的’{‘不需要獨占一行,包括方法之后,if,switch等。
  • 必須要統(tǒng)一的要求,屬性的定義請按照下圖property之后,空一格,括號之后空一格,寫上類名,空一格之后跟上*和屬性名。
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) DeliveryModel *delivery;
@property (nonatomic, strong) DeliveryLookAdapter *lookAdapter;
@property (nonatomic, strong) DeliveryLookAPIManager *lookManager;

  • 遵循一般代碼規(guī)范,多模仿蘋果API。
  • 刪除不用的代碼。
  • 如果有方法一直不會用到,請刪除(除工具類)。
  • 沒有執(zhí)行任何業(yè)務邏輯的方法,請刪除或給予注釋,刪除多余的資。源或文件,添加必要的注釋。
  • 比較大的代碼塊需要給出注釋。

其它規(guī)范


  • 盡量以純代碼形式開發(fā),frame配合Masonry或者Extension來布局,宏定義或者常量表示寬高,避免使用320或375等固定數(shù)值。
  • 數(shù)據(jù)提供統(tǒng)一的入口。無論是在 MVP、MVC 還是 MVVM 中,提供一個統(tǒng)一的數(shù)據(jù)入口,都可以讓代碼變得更加易于維護。比如可使用一個DataManager,把 http、preference、eventpost、database 都放在DataManger里面進行操作,我們只需要與DataManger打交道
  • 提取方法,去除重復代碼。對于必要的工具類抽取也很重要,這在以后的項目中是可以重用的。
  • 盡可能的使用局部變量
  • 盡量減少對變量的重復計算。
  • 盡量在合適的場合使用單例。使用單例可以減輕加載的負擔,縮短加載的時間,提高加載效率。但并不是所有的地方都適用于單例,簡單來說單例主要適用于以下三個方面:
    1. 控制資源的使用,通過線程同步來控制資源的并發(fā)訪問。
    2. 控制實例的產生,以達到節(jié)約資源的目的。
    3. 控制數(shù)據(jù)的共享,在不建立直接關聯(lián)的條件下,讓多個不相關的進程或線程之間實現(xiàn)通信。
  • 最后不要忘了檢測內存泄漏??墒褂肐nstruments分析內存等。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容