Objective-C代碼規(guī)范

Xcode工程

1.物理文件應(yīng)該與Xcode工程文件保持同步來避免文件擴張浑塞。 即Xcode下的Group應(yīng)存在對應(yīng)的文件夾炫乓。代碼不僅是根據(jù)類型來分組压鉴,而且還可以根據(jù)功能來分組柿汛,這樣代碼更加清晰胸嘴。
2.代碼行最多應(yīng)不超過80列

代碼行不超過80列.png

3.縮進統(tǒng)一使用4空格

4空格縮進.png

代碼組織

在函數(shù)分組和protocol/delegate實現(xiàn)中使用#pragma mark -來分類方法。主要有:
#pragma mark - Lifecycle
- (instancetype)init{}
- (void)dealloc{}
- (void)viewDidLoad{}
- (void)viewWillAppear:(BOOL)animated{}
- (void)didReceiveMemoryWarning{}

#pragma mark - IBActions
- (IBAction)submitData:(id)sender{}

#pragma mark - Public
- (void)publicMethod{}

#pragma mark - Private
- (void)privateMethod {}

#pragma mark - UITextFieldDelegate

#pragma mark - UITableViewDataSource

#pragma mark - UITableViewDelegate

Class

類的命名應(yīng)使用大駝峰命名法則, 如:HomePageViewController.h
雖然官方推薦通用的類需要添加前綴,而只在應(yīng)用使用的類則不需要使用前綴, 但是為了項目的統(tǒng)一風格, 或者在#import的時候?qū)㈨椖績?nèi)的類跟第三方, 系統(tǒng)的類區(qū)分開, 此處應(yīng)都添加前綴(前綴應(yīng)是本項目的2-3個大寫字母)

UIApplication
AFNetworking
MKMessageViewController

錯誤示例

Application
afNetworking
MessageViewController

Category

Category的命名應(yīng)使用前綴+擴展類名+功能描述次, 例如要擴展一個基于NSString的解析類, 文件應(yīng)命名成UIColor+MCStyle.h, Category的本身命名可以書寫成

@interface UIColor (MCStyle)

@end

Methods

書寫規(guī)范

  • 首先 +/- 后緊跟一個空格與返回值分開,參數(shù)類型跟*也要用空格分開,如下,

  • 方法大括號和其他大括號(if/else/switch/while 等.)總是在同一行語句打開但在新行中關(guān)閉寄锐。

- (void)setExampleText:(NSString *)text image:(UIImage *)image{
    // doSomething
}
if (user.isHappy) {
    //Do something
} else {
    //Do something else
}

錯誤示例:

if (user.isHappy)
{
  //Do something
}
else {
  //Do something else
}

命名規(guī)范

  • 方法命名一般規(guī)則由動詞+名詞組成, 應(yīng)該要書寫完整單詞, 不使用縮寫, 但是and應(yīng)盡量不用于連接參數(shù), 要達到執(zhí)行方法就像是在讀語句
- (void)invokeWithTarget:(id)target;
- (void)setExampleText:(NSString *)text image:(UIImage *)image;

錯誤示例:

- (void)invokeWith:(id)target;
- (void)setExampleText:(NSString *)text i:(UIImage *)image;
  • get/set方法, get方法應(yīng)該直接使用屬性名, 而不要添加get前綴, BOOL返回值狀態(tài)類型應(yīng)該使用is前綴命名, 而且其他形容詞方法則可以使用can, should等詞
- (CGSize)cellSize;
- (BOOL)isEditing;
- (void)setEditing:(BOOL)flag;
- (BOOL)canHide;
- (void)setCanHide:(BOOL)flag;

錯誤示例:

- (CGSize)getCellSize;
- (NSSize)getEditing;
- (void)changeEditing:(BOOL)flag;
- (BOOL)hide;
- (void)canHide:(BOOL)flag;

方法調(diào)用

  • 若是一行能書寫完整方法, 當然是最好, 單很多情況下OC因為命名規(guī)則, 多參數(shù)等原因, 方法調(diào)用很容易超過一行80列, 這時候應(yīng)該選擇換行并對齊參數(shù)
- (void)doSomethingWith:(GTMFoo *)theFoo
                   rect:(NSRect)theRect
               interval:(float)theInterval {
  ...
}

而不能

[myObject doFooWith:arg1 name:arg2  // some lines with >1 arg
              error:arg3];
[myObject doFooWith:arg1
               name:arg2 error:arg3];
[myObject doFooWith:arg1
          name:arg2  // aligning keywords instead of colons
          error:arg3];

Properties

書寫規(guī)范

  • @property后應(yīng)緊跟空格將屬性特性分割開來, 屬性特性應(yīng)按照IBOutlet的特性聲明順序, 即storage兵多、atomicity, 類型與變量名之間應(yīng)用空格分開, 引用類型的 * 應(yīng)挨著變量名
@property (copy, nonatomic) NSString *title;

錯誤示例

@property(copy, nonatomic) NSString *title;
@property (nonatomic, copy) NSString *title;
@property(copy, nonatomic) NSString*title;

此處注意, NSString應(yīng)用copy聲明而不是retain或者strong, 因為可能會出現(xiàn)誤傳NSMutableString導(dǎo)致值會被更新

命名規(guī)范

變量命名應(yīng)遵循小駝峰命名方法, 并書寫完整單詞, IBOutlet類型變量則應(yīng)包含完整控件內(nèi)容

@property (copy, nonatomic) NSString *title;
@property (strong, nonatomic) UIImage *image;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;

錯誤示例

@property (copy, nonatomic) NSString *tle;
@property (strong, nonatomic) UIImage *img;
@property (weak, nonatomic) IBOutlet UILabel *name;

屬性的訪問應(yīng)使用點, 而不是[]

[UIApplication sharedApplication].delegate
self.array.count

錯誤示例

[[UIApplication sharedApplication] delegate]
[self.array count]

若你不確認要獲取的值是不是屬性, 請用command+鼠標左鍵點擊進去看

屬性的使用方式

為保證代碼的一致性盡可能使用私有屬性, 而不是實例屬性

@interface MKUtil : NSObject
@property (strong, nonatomic) NSString *utilName;
@end

錯誤示例

@interface MKUtil : NSObject {
  NSString *utilName;
}

私有屬性的訪問應(yīng)該統(tǒng)一使用self.xxx來訪問, 而不是直接訪問_xxx, self.xxx才會調(diào)用get方法來獲取值, 統(tǒng)一出口才能避免產(chǎn)生不必要的錯誤

self.tableView.tableFooterView

錯誤示例

_tableView.tableFooterView
常量
  • 類內(nèi)部使用的常量應(yīng)使用static進行聲明, 而不是#define, 常量的命名遵循大駝峰命名, 需要前綴+具體存在的類+實際含義
static NSString * const HomePageViewControllerWebsite = @"[www.baidu.com";](http://www.baidu.com/)
static CGFloat const HomePageImageThumbnailHeight = 50.0;

錯誤示例

#define Website @"[www.baidu.com](http://www.baidu.com/)"
#define thumbnailHeight 2
  • 全局使用的常量則應(yīng)該使用extern進行聲明, 如notification
extern NSString * const NSApplicationDidBecomeActiveNotification

注意notification聲明的常量一定有notification結(jié)尾, 還是那句讀完名字就能馬上知道這變量, 方法是做什么的, 代碼自注釋

枚舉

枚舉的聲明應(yīng)使用NS_ENUM語法, 而不enum, 命名規(guī)則依舊是大駝峰(這里命名我覺得也可以有下劃線), 由枚舉類型+具體類型單詞組成,可以顯式的賦值

typedef NS_ENUM(NSInteger, NSTextAlignment) {
    NSTextAlignmentLeft           = 1,
    NSTextAlignmentCenter         = 2,
    NSTextAlignmentRight          = 3,
    NSTextAlignmentJustified      = 4,
    NSTextAlignmentNatural        = 5,
};

其他

BOOL
  • BOOL值變量應(yīng)該只是用YES跟NO. 因為true和false應(yīng)該只在CoreFoundation,C或C++代碼使用.BOOL變量應(yīng)該直接用于判斷, 而不能用于跟YES或者NO比較, 因為BOOL被設(shè)定為8位
BOOL status = YES;
if (status){
    // doSomething
}

錯誤示例

BOOL status = YES;
if (status == YES){
    // doSomething
}
  • 如果BOOL屬性的名字是一個形容詞橄仆,屬性就能忽略"is"前綴剩膘,但要指定get訪問器的慣用名稱。例如:
@property (assign, getter=isEditable) BOOL editable;
單例

單例應(yīng)該使用標準Objective-C語法創(chuàng)建

+ (instancetype)sharedInstance {
  static id sharedInstance;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
      sharedInstance = [[self alloc] init];
  });
  return sharedInstance;
}

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盆顾,一起剝皮案震驚了整個濱河市怠褐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌您宪,老刑警劉巖奈懒,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奠涌,死亡現(xiàn)場離奇詭異,居然都是意外死亡磷杏,警方通過查閱死者的電腦和手機溜畅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來极祸,“玉大人慈格,你說我怎么就攤上這事∫=穑” “怎么了浴捆?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汰规。 經(jīng)常有香客問我汤功,道長物邑,這世上最難降的妖魔是什么溜哮? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮色解,結(jié)果婚禮上茂嗓,老公的妹妹穿的比我還像新娘。我一直安慰自己科阎,他們只是感情好述吸,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锣笨,像睡著了一般蝌矛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上错英,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天入撒,我揣著相機與錄音,去河邊找鬼椭岩。 笑死茅逮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的判哥。 我是一名探鬼主播献雅,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼塌计!你這毒婦竟也來了挺身?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤锌仅,失蹤者是張志新(化名)和其女友劉穎瞒渠,沒想到半個月后良蒸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡伍玖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年嫩痰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窍箍。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡串纺,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出椰棘,到底是詐尸還是另有隱情纺棺,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布邪狞,位于F島的核電站祷蝌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏帆卓。R本人自食惡果不足惜巨朦,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剑令。 院中可真熱鬧糊啡,春花似錦、人聲如沸吁津。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碍脏。三九已至梭依,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間典尾,已是汗流浹背役拴。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留急黎,地道東北人扎狱。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像勃教,于是被迫代替她去往敵國和親淤击。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348