iOS開發(fā)規(guī)范(超詳細(xì)的)

前言


本文是本寶寶參考自己的部分代碼規(guī)范和網(wǎng)上眾多其它小伙伴的代碼規(guī)范柬唯,整理和寫出的揭北。規(guī)范涵蓋了很多內(nèi)容,閱讀的小伙伴多點(diǎn)耐心哈之碗。

目的


為了利于項(xiàng)目維護(hù)以及規(guī)范開發(fā)蝙眶,促進(jìn)成員之間Code Review的效率,故提出以下開發(fā)規(guī)范,如有更好的建議幽纷,歡迎提出式塌。
本文檔的預(yù)期讀者包括:iOS開發(fā)人員。

命名規(guī)范


代碼中的命名嚴(yán)禁使用拼音與英文混合的方式,更不允許直接使用中文的方式友浸。正確的英文拼寫和語法可以讓閱讀者易于理解,避免歧義峰尝。
*注意:即使純拼音命名方式也要避免采用。但alibab收恢、taobao武学、youku、hangzhou等國際通用的名稱伦意,可視同英文.

大駝峰規(guī)則:每個(gè)單詞的首字母大寫火窒。例:NameTextField。
小駝峰原則:第一個(gè)單詞首字母小寫驮肉,其余都大寫熏矿。例:nameTextField。

項(xiàng)目命名

項(xiàng)目名都遵循大駝峰命名离钝。例如:AoRiseProject票编。

Bundle Identifier 命名

Bundle Identifier:采用反域名命名規(guī)范,全部采用小寫字母卵渴,以域名后綴+公司頂級域名+應(yīng)用名形式命名栏妖,例如:com.rogrand.dianbangbang

類名

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

在實(shí)際開發(fā)中宛裕,一般都會(huì)給工程中所有的類加上屬于本工程的前綴瑟啃。

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

控件名 類型 示例
UIViewController ViewController MWBaseViewController
UView View MWBaseView
UITableView TableView MWOrderTableView
UITableViewCell Cell MWOrderListCell
UIButton Button MWSuccessButton
UILabel Label MWSuccessLabel
UIImageView ImgView MWGoodsImgView
UITextField TextField MWNameTextField
UITextView TextView MWSuggestTextView

其它類相關(guān)對照表

功能 類型 示例
工具類 Tool MWOrderTool
代理類 Delegate MWOrderListDelegate
管理類 Manager MWOrderListModel
模型類 Model MWOrderListModel
Service類 Service MWOrderService
布局類 Layout MWHomeLayout
數(shù)據(jù)庫類 DataBase岩榆、表名+DBHelper MWFriendDataBase错负、MWUserTableDBHelper
類目 XXX+(范圍,例如Extension勇边, Additions 或者功能犹撒,例如Frame,Nib粒褒,Block) MWUIButton+Additions识颊、MWUIButton+Block

UIViewController請按照如下分類

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

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

#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響應(yīng)事件桨昙。
變量命名對照表(如果用到下表中沒有列舉出來检号,請去掉UINS遵循實(shí)際規(guī)則即可绊率〗髁玻或者一看就知道的通用簡寫)
方法命名對照表(方法多為動(dòng)詞或動(dòng)名詞)

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

常量

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

參數(shù)名

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

資源文件規(guī)范


資源文件命名

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

說明 前綴(工程前綴示例MW) 示例
按鈕相關(guān) mw_btn_ mw_btn_home_normal粟瞬、mw_btn_red,mw_btn_red_big
背景相關(guān) mw_btn_ mw_bg_home_header同仆、mw_bg_main
圖標(biāo)相關(guān) mw_ic_ mw_ic_home_location、mw_bg_input
分割線相關(guān) mw_div_ mw_ic_home_location裙品、mw_bg_input
默認(rèn)相關(guān) mw_def_ mw_ic_home_location俗批、mw_bg_input

文件夾命名

創(chuàng)建文件夾最好創(chuàng)建實(shí)體文件夾,找到工程目錄市怎,創(chuàng)建相應(yīng)文件夾并拖入工程岁忘。文件夾命名使用相應(yīng)模塊結(jié)構(gòu)分層的英文,首字母要大寫区匠。例:Model臭觉,ViewControllerTool蝠筑,Other狞膘,Service等等。

版本規(guī)范


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

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

第三方庫規(guī)范


希望Team能用時(shí)下較新的技術(shù)辅愿,對開源庫的選取,一般都需要選擇比較穩(wěn)定的版本忆某,作者在維護(hù)的項(xiàng)目点待,要考慮作者對issue的解決,以及開發(fā)者的知名度等各方面弃舒。選取之后癞埠,一定的封裝是必要的。

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

注釋規(guī)范


為了減少他人閱讀你代碼的痛苦值通铲,請?jiān)陉P(guān)鍵地方做好注釋。

類注釋

//
//  MyViewController.m
//  text
//
//  Created by 林霞 on 2017/9/12.
//  Copyright ? 2017年 林霞 1826692128@qq.com. All rights reserved.
//

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

方法注釋

方法注釋,方法外部統(tǒng)一用option + command + /饲宿,方法內(nèi)部統(tǒng)一用//注釋厦酬。

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

模型注釋

每個(gè)model中的,包含的每個(gè)屬性瘫想,都必須要寫上相對應(yīng)的注釋仗阅,用///注釋。閱讀者一看這個(gè)model国夜,就清楚知道model中的每個(gè)字段代表的意思减噪,用來做什么事情的。

@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;
///商品總個(gè)數(shù)
@property (nonatomic, assign) NSInteger goodsCount;
@end

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

編碼規(guī)范


  • 所有的方法之間空一行抗斤。
  • 所有的代碼塊之間空一行囚企,刪除多余的注釋。
  • 所有自定義的方法需要給出注釋瑞眼。
  • 盡量使用懶加載龙宏,在控制器分類時(shí)有提及和要求,其它自定義類按照控制器格式分類伤疙,沒有的分類不寫即可银酗。
  • 代碼后的’{‘不需要獨(dú)占一行,包括方法之后掩浙,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部默。
  • 刪除不用的代碼。
  • 如果有方法一直不會(huì)用到造虎,請刪除(除工具類)傅蹂。
  • 沒有執(zhí)行任何業(yè)務(wù)邏輯的方法,請刪除或給予注釋算凿,刪除多余的資份蝴。源或文件,添加必要的注釋氓轰。
  • 比較大的代碼塊需要給出注釋婚夫。

其它規(guī)范


  • 建議項(xiàng)目統(tǒng)一使用Masonry和xib結(jié)合的方式布局。不允許出現(xiàn)直接設(shè)置frame的情況署鸡。如果是純代碼的項(xiàng)目案糙,不允許出現(xiàn)xib和拉約束的情況限嫌。不建議使用純storyboard開發(fā)。
  • 數(shù)據(jù)提供統(tǒng)一的入口时捌。無論是在 MVP怒医、MVC 還是 MVVM 中,提供一個(gè)統(tǒng)一的數(shù)據(jù)入口匣椰,都可以讓代碼變得更加易于維護(hù)裆熙。比如可使用一個(gè)DataManager,把 http禽笑、preference入录、eventpost、database 都放在DataManger里面進(jìn)行操作佳镜,我們只需要與DataManger打交道
  • 提取方法僚稿,去除重復(fù)代碼。對于必要的工具類抽取也很重要蟀伸,這在以后的項(xiàng)目中是可以重用的蚀同。
  • 盡可能的使用局部變量
  • 盡量減少對變量的重復(fù)計(jì)算。
  • 盡量在合適的場合使用單例啊掏。使用單例可以減輕加載的負(fù)擔(dān)蠢络,縮短加載的時(shí)間,提高加載效率迟蜜。但并不是所有的地方都適用于單例刹孔,簡單來說單例主要適用于以下三個(gè)方面:
    1. 控制資源的使用,通過線程同步來控制資源的并發(fā)訪問娜睛。
    2. 控制實(shí)例的產(chǎn)生髓霞,以達(dá)到節(jié)約資源的目的。
    3. 控制數(shù)據(jù)的共享畦戒,在不建立直接關(guān)聯(lián)的條件下方库,讓多個(gè)不相關(guān)的進(jìn)程或線程之間實(shí)現(xiàn)通信。
  • 最后不要忘了檢測內(nèi)存泄漏障斋∽萘剩可使用Instruments分析內(nèi)存。

緒言


文章如果有什么問題垃环,請閱讀過的小伙伴告知邀层,我會(huì)立即更正。
如果有什么意見或者建議晴裹,歡迎提出或者一塊討論被济。
希望可以一起寫出更好的代碼救赐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涧团,一起剝皮案震驚了整個(gè)濱河市只磷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泌绣,老刑警劉巖钮追,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阿迈,居然都是意外死亡元媚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門苗沧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刊棕,“玉大人,你說我怎么就攤上這事待逞∩牵” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵识樱,是天一觀的道長嗤无。 經(jīng)常有香客問我,道長怜庸,這世上最難降的妖魔是什么当犯? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮割疾,結(jié)果婚禮上嚎卫,老公的妹妹穿的比我還像新娘。我一直安慰自己杈曲,他們只是感情好驰凛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著担扑,像睡著了一般恰响。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涌献,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天胚宦,我揣著相機(jī)與錄音,去河邊找鬼燕垃。 笑死枢劝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卜壕。 我是一名探鬼主播您旁,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼轴捎!你這毒婦竟也來了鹤盒?” 一聲冷哼從身側(cè)響起蚕脏,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侦锯,沒想到半個(gè)月后驼鞭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尺碰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年挣棕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亲桥。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洛心,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出题篷,到底是詐尸還是另有隱情皂甘,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布悼凑,位于F島的核電站偿枕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏户辫。R本人自食惡果不足惜渐夸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渔欢。 院中可真熱鬧墓塌,春花似錦、人聲如沸奥额。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垫挨。三九已至韩肝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間九榔,已是汗流浹背哀峻。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哲泊,地道東北人剩蟀。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像切威,于是被迫代替她去往敵國和親育特。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理先朦,服務(wù)發(fā)現(xiàn)缰冤,斷路器槽袄,智...
    卡卡羅2017閱讀 134,651評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • iOS編程規(guī)范0規(guī)范 0.1前言 為??高產(chǎn)品代碼質(zhì)量,指導(dǎo)廣大軟件開發(fā)人員編寫出簡潔、可維護(hù)锋谐、可靠、可 測試截酷、高效...
    iOS行者閱讀 4,455評論 21 35
  • 空森林閱讀 689評論 0 0
  • 一個(gè)理由涮拗,二個(gè)理由,哭的時(shí)候沒理由迂苛。眼眶一緊三热,總覺得最委屈的是自己。尤其感情的事三幻,是自己的事就漾,與旁人無關(guān)。 ...
    小忘閱讀 596評論 0 0