iOS開(kāi)發(fā)代碼規(guī)范

1. 關(guān)于命名

1.統(tǒng)一要求
含義清楚,盡量做到不需要注釋也能了解其作用偏塞,若做不到府瞄,就加注釋?zhuān)皇褂萌Q(chēng)廉赔,不使用縮寫(xiě)
2 類(lèi)的命名
大駝峰式命名:每個(gè)單詞的首字母都采用大寫(xiě)字母
例子:
TWHomePageViewController
后綴要求
ViewController: 使用ViewController做后綴
例子: 
MFHomeViewController

View: 使用View做后綴
例子:
 MFAlertView

UITableCell:使用Cell做后綴 
例子: 
MFNewsCell

Protocol: 使用Delegate或者DataSource作為后綴
例子: 
UITableViewDelegate
UI控件依次類(lèi)推
3 私有變量
小駝峰式命名:第一個(gè)單詞以小寫(xiě)字母開(kāi)始青抛,后面的單詞的首字母全部大寫(xiě)
例子:firstName、lastName
以 _ 開(kāi)頭酬核,第一個(gè)單詞首字母小寫(xiě)
例子:NSString * _somePrivateVariable
私有變量放在 .m 文件中聲明
4 property變量
小駝峰式命名
//例子:
@property (nonatomic, copy) NSString *userName;
禁止使用synthesize關(guān)鍵詞
5 宏命名
全部大寫(xiě)蜜另,單詞間用 _ 分隔。[不帶參數(shù)]
例子:
#define THIS_IS_AN_MACRO @"THIS_IS_AN_MACRO"
常量以字母 k 開(kāi)頭嫡意,后面遵循大駝峰命名举瑰。[不帶參數(shù)]
例子:
#define kWidth 320.0
小駝峰命名。[帶參數(shù)]
#define getImageUrl(url) [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",kBaseUrl,url]]
6 Enum
Enum類(lèi)型的命名與類(lèi)的命名規(guī)則一致
Enum中枚舉內(nèi)容的命名需要以該Enum類(lèi)型名稱(chēng)開(kāi)頭
例子:
typedef NS_ENUM(NSInteger, AFNetworkReachabilityStatus) {
AFNetworkReachabilityStatusUnknown = -1,
AFNetworkReachabilityStatusNotReachable = 0,
AFNetworkReachabilityStatusReachableViaWWAN = 1,
AFNetworkReachabilityStatusReachableViaWiFi = 2
 };
7 Delegate命名
類(lèi)的實(shí)例必須為回調(diào)方法的參數(shù)之一, 如
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section
回調(diào)方法的參數(shù)只有類(lèi)自己的情況蔬螟,方法名要符合實(shí)際含義, 如:
-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView
以類(lèi)的名字開(kāi)頭(回調(diào)方法存在兩個(gè)以上參數(shù)的情況)以表明此方法是屬于哪個(gè)類(lèi)的, 如:
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
使用did和will通知Delegate已經(jīng)發(fā)生的變化或?qū)⒁l(fā)生的變化, 如:
-(NSIndexPath*)tableView:(UITableView*)tableView willSelectRowAtIndexPath:(NSIndexPath*)indexPath;
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath;

2. 私有方法及變量聲明

1 聲明位置
在.m文件中最上方此迅,定義空的category進(jìn)行聲明

例子:
#import "CodeStandardViewController.h"
// 在這個(gè)category(類(lèi)目)中定義變量和方法
@interface CodeStandardViewController ()
{
// 聲明私有變量
}
// 私有方法
- (void)samplePrivateMethod;
@end
@implementation CodeStandardViewController
// 私有方法的實(shí)現(xiàn)
- (void)samplePrivateMethod{
//some code
}

3. 關(guān)于注釋

盡管寫(xiě)的時(shí)候很痛苦,但是他們對(duì)于保持你代碼的可讀性來(lái)說(shuō)絕對(duì)是至關(guān)重要的旧巾。下面幾條規(guī)則描述了你應(yīng)該什么時(shí)候在什么地方加注釋耸序。
但是要記住,雖然注釋很重要鲁猩,但是最好的代碼都是自注釋的坎怪。給變量和類(lèi)型一個(gè)有意義的名字,要比用一個(gè)難懂的名字然后再費(fèi)力的用注釋來(lái)解釋好得多廓握。
寫(xiě)注釋的時(shí)候搅窿,要寫(xiě)給你的讀者:下一個(gè)要讀懂你代碼的貢獻(xiàn)者。多寫(xiě)點(diǎn)吧——下個(gè)沒(méi)準(zhǔn)就是你自己隙券!
注釋需要與代碼同步更新
1 File Comments文件注釋

可以有選擇的在一個(gè)文件開(kāi)頭寫(xiě)一段關(guān)于內(nèi)容的描述男应。

2 屬性注釋

快捷鍵: 光標(biāo)放在屬性名前面 command+option+/

例子:

/**
 學(xué)生
 */
@property (nonatomic, strong) Student *student;
3 方法聲明注釋Declaration Comments

快捷鍵: 光標(biāo)放在方法名前面 command+option+/

每個(gè)接口,類(lèi)別娱仔,協(xié)議的聲明都應(yīng)該有個(gè)伴隨的注釋?zhuān)瑏?lái)描述他的作用以及他如何融入整體環(huán)境

/** 
登錄驗(yàn)證

@param personId 用戶(hù)名
@param password 密碼
@param complete 執(zhí)行完畢的block
*/
+ (void)loginWithPersonId:(NSString *)personId password:(NSString *)password complete:(void (^)(CheckLogon *result))complete;
4 實(shí)現(xiàn)聲明Implementation Comments

用豎向排列方式在注釋中引用變量名和符號(hào)沐飘,不要寫(xiě)成一整行。

4. 關(guān)于UI布局

使用Interface Builder進(jìn)行界面布局
Xib文件的命名與其對(duì)應(yīng)的.h文件保持相同
Xib文件中控件的組織結(jié)構(gòu)要合理拟枚,Xib文件中控件需要有合理的可讀性強(qiáng)的命名薪铜,方便他人理解

5. 格式化代碼

1 指針 "*" 位置
定義一個(gè)對(duì)象時(shí),指針 "*" 靠近變量
//例子:
NSString *userName;
2 方法的聲明和定義
在 "-" 恩溅、"+" 和 返回值之間留一個(gè)空格隔箍,方法名和第一個(gè)參數(shù)之間不留空格
“=”、“==”脚乡、“>=”蜒滩、“<=”滨达、“/”、“%”等符號(hào)前后需要均需有一個(gè)空格
“]” 后面如果跟的是方法名俯艰,需要有一個(gè)空格
- (id)initWithNibName:(NSString *)nibName nibBundle:(NSBundle *)nibBundle{}
3代碼縮進(jìn)
使用 xcode 默認(rèn)縮進(jìn)捡遍,即 tab = 4空格
使用 xcode 中 re-indent 功能定期對(duì)代碼格式進(jìn)行整理
相同類(lèi)型變量聲明需要獨(dú)行聲明
例子:
CGFloatOriginX = frame.origin.x;
CGFloatOriginY = frame.origin.y;
CGFloatlineWidth = frame.size.width;
Method與Method之間最多空一行郎汪,但要在一個(gè)項(xiàng)目里統(tǒng)一攻旦,要么都空一行,要么都不空行
例子:
 #pragma mark - private methods
- (void)samplePrivateMethod{}
- (void)sampleForIf {}

復(fù)制代碼

4 對(duì)method進(jìn)行分組
使用 #pragma mark - 方式對(duì)類(lèi)的方法進(jìn)行分組
例子:
#pragma mark -
#pragma mark - private
- (void)samplePrivateMethod{}
- (void)sampleForIf{}
- (void)wrongExamples{}


#pragma mark -
#pragma mark - public methods
  • (void)samplePublicMethodWithParam:(NSString*)sampleParam{}
#pragma mark -
#pragma mark - life cycle methods
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{}
- (void)viewDidLoad{}
5 大括號(hào)寫(xiě)法
對(duì)于類(lèi)的method: 左括號(hào)另起一行寫(xiě)(蘋(píng)果官方文檔)龄捡,但是我個(gè)人覺(jué)得左括號(hào)跟在第一行后邊會(huì)更好啦辐,因?yàn)檫@樣把代碼折疊起來(lái)效果更好谓传,可以看到的方法更多
例子:
- (id)initWithNibName:(NSString *)nibNameOrNilbundle:(NSBundle *)nibBundleOrNil{

     self = [super initWithNibName:nibName OrNilbundle:nibBundleOrNil];
     if (self) {

          // Custom initialization
      } 
 return self;
}
對(duì)于其他使用場(chǎng)景: 左括號(hào)跟在第一行后邊

例子:
- (void)sampleForIf {

    BOOL someCondition = YES;
    if(someCondition) {
    
    // do something here
    }
}
- (void)sampleForWhile {

     int i = 0;
     while (i < 10) {

     // do something here
         i = i + 1;
     }
 }
- (void)sampleForSwitch{
SampleEnum testEnum = SampleEnumTwo;
switch(testEnum) {
    caseSampleEnumUndefined:{
        // do something
        break;
    }
    caseSampleEnumOne:{
        // do something
        break;
    }
    caseSampleEnumTwo:{
        // do something
        break;
    }
    default:{
        NSLog(@"WARNING: there is an enum type not handled properly!");
        break;
        }
    }
}
任何需要寫(xiě)大括號(hào)的部分,不得省略
錯(cuò)誤示例:
 - (void)wrongExamples{
    BOOLsomeCondition = YES;
    if (someCondition)
        NSLog(@"this is wrong!!!");
    while(someCondition)
        NSLog(@"this is wrong!!!");
 }
6 代碼寬度芹关、函數(shù)的行數(shù)续挟、類(lèi)的行數(shù)
每行的寬度

應(yīng)盡量在你的代碼中將每行控制在80個(gè)字符內(nèi)。

每個(gè)函數(shù)的行數(shù)

應(yīng)盡量在你的代碼中將每個(gè)函數(shù)的行數(shù)控制在100行內(nèi)侥衬。

每個(gè)類(lèi)的行數(shù)

應(yīng)盡量在你的代碼中將每個(gè)類(lèi)的行數(shù)控制在1000行內(nèi)诗祸。

盡量使用新的API

項(xiàng)目最低適配系統(tǒng)如果設(shè)置的是在iOS8以上
建議把UIActionSheet和UIAlertView統(tǒng)一升級(jí)為UIAlertController
建議把UIWebView升級(jí)為WKWebView

項(xiàng)目最低適配系統(tǒng)如果設(shè)置的是在iOS9以上
建議把AddressBook升級(jí)為Contacts

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市轴总,隨后出現(xiàn)的幾起案子直颅,更是在濱河造成了極大的恐慌,老刑警劉巖际乘,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異漂佩,居然都是意外死亡脖含,警方通過(guò)查閱死者的電腦和手機(jī)养葵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)着绊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人熟尉,你說(shuō)我怎么就攤上這事归露。” “怎么了斤儿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵剧包,是天一觀(guān)的道長(zhǎng)恐锦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)疆液,這世上最難降的妖魔是什么一铅? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮堕油,結(jié)果婚禮上潘飘,老公的妹妹穿的比我還像新娘。我一直安慰自己掉缺,他們只是感情好福也,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著攀圈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峦甩。 梳的紋絲不亂的頭發(fā)上赘来,一...
    開(kāi)封第一講書(shū)人閱讀 51,198評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音凯傲,去河邊找鬼犬辰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛冰单,可吹牛的內(nèi)容都是我干的幌缝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诫欠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涵卵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起荒叼,我...
    開(kāi)封第一講書(shū)人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤轿偎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后被廓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體坏晦,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年嫁乘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昆婿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜓斧,死狀恐怖仓蛆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挎春,我是刑警寧澤多律,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布痴突,位于F島的核電站,受9級(jí)特大地震影響狼荞,放射性物質(zhì)發(fā)生泄漏辽装。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一相味、第九天 我趴在偏房一處隱蔽的房頂上張望拾积。 院中可真熱鬧,春花似錦丰涉、人聲如沸拓巧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肛度。三九已至,卻和暖如春投慈,著一層夾襖步出監(jiān)牢的瞬間承耿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工伪煤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留加袋,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓抱既,卻偏偏與公主長(zhǎng)得像职烧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子防泵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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

  • 此文整理是為了方便一些朋友規(guī)范代碼適用于新人(ps:如果你已經(jīng)很規(guī)范的執(zhí)行了那么可以跳過(guò)此內(nèi)容)這樣以來(lái)如果有...
    無(wú)灃閱讀 379評(píng)論 0 1
  • 1. 關(guān)于命名 1.1 統(tǒng)一要求 含義清楚蚀之,盡量做到不需要注釋也能了解其作用,若做不到捷泞,就加注釋 使用全稱(chēng)恬总,不適用...
    軟件iOS開(kāi)發(fā)閱讀 152評(píng)論 0 0
  • 關(guān)于命名1> 統(tǒng)一要求含義清楚,盡量做到不需要注釋也能了解其作用肚邢,若做不到壹堰,就加注釋使用全稱(chēng),不使用縮寫(xiě) 2> 類(lèi)...
    the宇亮閱讀 279評(píng)論 0 0
  • 1. 關(guān)于命名 1.1 統(tǒng)一要求 含義清楚骡湖,盡量做到不需要注釋也能了解其作用贱纠,若做不到,就加注釋 使用全稱(chēng)响蕴,不適用...
    EurekaFlutter閱讀 209評(píng)論 0 0
  • 一 我們什么都沒(méi)有說(shuō) 似乎又什么都說(shuō)了 你看著我 我看著你 點(diǎn)點(diǎn)頭谆焊,微微一笑 很久,很久…… 直到 我們?cè)俅蜗嘤?...
    羅雨靜閱讀 264評(píng)論 0 2