OC代碼規(guī)范

命名

Preferred :

UIColor *myColor = [UIColor whiteColor];

Not Preferred :

UIColor *myColour = [UIColor whiteColor];

代碼組織

使用#pragma mark - 將生命周期、分類方法和代理方法分塊標注管理

#pragma mark - Lifecycle

- (instancetype)init {}
- (void)dealloc {}
- (void)viewDidLoad {}
- (void)viewWillAppear:(BOOL)animated {}
- (void)didReceiveMemoryWarning {}

#pragma mark - Custom Accessors

- (void)setCustomProperty:(id)value {}
- (id)customProperty {}

#pragma mark - IBActions

- (IBAction)submitData:(id)sender {}

#pragma mark - Public

- (void)publicMethod {}

#pragma mark - Private

- (void)privateMethod {}

#pragma mark - Protocol conformance
#pragma mark - UITextFieldDelegate
#pragma mark - UITableViewDataSource
#pragma mark - UITableViewDelegate

#pragma mark - NSCopying

- (id)copyWithZone:(NSZone *)zone {}

#pragma mark - NSObject

- (NSString *)description {}

#pragma mark -  lazy

空格

  • 使用2個空格不要使用Tab鍵
  • 方法和其他后的大括弧在第一行開始在新的一行結束黎棠。
    Preferred:
if (user.isHappy) {
  //Do something
} else {
  //Do something else
}

Not Preferred:

if (user.isHappy)
{
    //Do something
}
else {
    //Do something else
}
  • 在方法中的參數(shù)中間添加一個空格方便閱讀。
  • 優(yōu)先使用自動生成窄驹,但是如果需要的話可以在實現(xiàn)文件中添加@ synthesize 和 @dynamic。
  • 調用方法時盡量避免方法中冒號對齊证逻。當方法中包含3個以上的參數(shù)乐埠,使用冒號對齊會增加方法的可讀性。但是囚企,當方法中包含block時Xcode 的自動對齊會讓代碼看起來不容易分辨丈咐。
    Preferred:
// blocks are easily readable
[UIView animateWithDuration:1.0 animations:^{
  // something
} completion:^(BOOL finished) {
  // something
}];

Not Preferred:

// colon-aligning makes the block indentation hard to read
[UIView animateWithDuration:1.0
                 animations:^{
                     // something
                 }
                 completion:^(BOOL finished) {
                     // something
                 }];

注釋

所有的注釋必須保持最新或者刪除,避免塊注釋龙宏。

命名

盡量保持蘋果的命名方式棵逊,長的,描述性和變量名都很好银酗。
Preferred:

UIButton *settingsButton;

Not Preferred:

UIButton *setBut;

對于類名和常量名一般使用三字母前綴辆影,在coreData 實體名稱可以省略。常量一般遵循駝峰命名方式黍特,使用相關類名最為前綴蛙讥。
Preferred:

static NSTimeInterval const RWTTutorialViewControllerNavigationFadeAnimationDuration = 0.3;

Not Preferred:

static NSTimeInterval const fadetime = 1.7;

屬性命名應該遵循首字母小寫的駝峰原則。盡量使用自動生成而非手動灭衷。
Preferred:

@property (strong, nonatomic) NSString *descriptiveVariableName;

Not Preferred:

id varnm;

下劃線

在初始化的時候次慢,實例變量使用下劃線。局部變量不要使用下劃線今布。

方法

在(+/-)符號后添加一個空格,關鍵詞應該對參數(shù)有簡單的描述拭抬。
關鍵字and的使用不建議使用在多參數(shù)的方法名中部默。

Preferred:

- (void)setExampleText:(NSString *)text image:(UIImage *)image;
- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;
- (id)viewWithTag:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height;

Not Preferred:

-(void)setT:(NSString *)text i:(UIImage *)image;
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;
- (id)taggedView:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width andHeight:(CGFloat)height;
- (instancetype)initWith:(int)width and:(int)height;  // Never do this.

變量

應該使用可描述的變量名稱。單字符變量名除了在for循環(huán)中使用其他情況不宜使用造虎。
*號應該跟在變量前傅蹂,NSString text not NSString text;
盡量使用私有屬性代替實例變量。
Preferred:

@interface RWTTutorial : NSObject
@property (strong, nonatomic) NSString *tutorialName;
@end

Not Preferred:

@interface RWTTutorial : NSObject {
  NSString *tutorialName;
}

屬性

Preferred:

@property (weak, nonatomic) IBOutlet UIView *containerView;
@property (strong, nonatomic) NSString *tutorialName;

Not Preferred:

@property (nonatomic, weak) IBOutlet UIView *containerView;
@property (nonatomic) NSString *tutorialName;

字符串屬性推薦使用copy不建議使用strong算凿。
Preferred:

@property (copy, nonatomic) NSString *tutorialName;

Not Preferred:

@property (strong, nonatomic) NSString *tutorialName;

點語法

Preferred:

NSInteger arrayCount = [self.array count];
view.backgroundColor = [UIColor orangeColor];
[UIApplication sharedApplication].delegate;

Not Preferred:

NSInteger arrayCount = self.array.count;
[view setBackgroundColor:[UIColor orangeColor]];
UIApplication.sharedApplication.delegate;

字面量

NSString, NSDictionary, NSArray, and NSNumber中盡量使用不可變的值份蝴。不要在NSArray 和NSDictionary中添加nil值會引起崩潰。
Preferred :

NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone": @"Kate", @"iPad": @"Kamal", @"Mobile Web": @"Bill"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingStreetNumber = @10018;

Not Preferred:

NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil];NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];NSNumber *buildingStreetNumber = [NSNumber numberWithInteger:10018];

常量

常量應該是靜態(tài)的常量氓轰,不應該是#define 除非作為宏使用婚夫。
Perferred:

static NSString * const RWTAboutViewControllerCompanyName = @"RayWenderlich.com";
static CGFloat const RWTImageThumbnailHeight = 50.0;

Not Perferred:

#define CompanyName @"RayWenderlich.com"#define thumbnailHeight 2

枚舉類型

For Example:

typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType) {
  RWTLeftMenuTopItemMain,
  RWTLeftMenuTopItemShows,
  RWTLeftMenuTopItemSchedule
};

你可以明確值的分配

typedef NS_ENUM(NSInteger, RWTGlobalConstants) {
  RWTPinSizeMin = 1,
  RWTPinSizeMax = 5,
  RWTPinCountMin = 100,
  RWTPinCountMax = 500,
};

Not Preferred:

enum GlobalConstants {
  kMaxPinSize = 5,
  kMaxPinCount = 500,
};

case 狀態(tài)

當在switch中使用枚舉類型,default是不需要的署鸡。

RWTLeftMenuTopItemType menuType = RWTLeftMenuTopItemMain;

switch (menuType) {
  case RWTLeftMenuTopItemMain:
    // ...
    break;
  case RWTLeftMenuTopItemShows:
    // ...
    break;
  case RWTLeftMenuTopItemSchedule:
    // ...
    break;
}

私有屬性

私有屬性應該在類的實現(xiàn)文件中的類擴展(匿名分類)中聲明案糙,命名分類(比如RWTPrivate或private)應該從不使用除非是擴展其他類限嫌。匿名分類應該通過使用<headerfile>+Private.h文件的命名規(guī)則暴露給測試。

@interface RWTDetailViewController ()
@property (strong, nonatomic) GADBannerView *googleAdView;
@property (strong, nonatomic) ADBannerView *iAdView;
@property (strong, nonatomic) UIWebView *adXWebView;
@end

布爾類型

Preferred:

if (someObject) {}
if (![anotherObject boolValue]) {}

Not Preferred:

if (someObject == nil) {}
if ([anotherObject boolValue] == NO) {}
if (isAwesome == YES) {} // Never do this.
if (isAwesome == true) {} // Never do this.

如果BOOL屬性的名字是一個形容詞时捌,屬性就能忽略"is"前綴怒医,但要指定get訪問器的慣用名稱。

@property (assign, getter=isEditable) BOOL editable;

條件語句

  • 后面要加大括號
    Preferred:
if (!error) {
  return success;
}

Not Preferred:

if (!error)
  return success;

or

if (!error)  return success;

三目運算符

Preferred:

NSInteger value = 5;
result = (value != 0) ? x : y;
BOOL isHorizontal = YES;
result = isHorizontal ? x : y;

Not Preferred:

result = a > b ? x = c > d ? c : d : y;

初始化方法

  • 返回類型是instancetype不是返回id奢讨。確保編譯器正確判斷推斷結果稚叹。
- (instancetype)init {
  self = [super init];
  if (self) {
    // ...
  }
  return self;
}

類構造方法

要求同上

@interface Airplane
+ (instancetype)airplaneWithType:(RWTAirplaneType)type;
@end

CGRect 方法

  • 訪問x,y,width或者height時使用CGGeometry來訪問。

Preferred:

CGRect frame = self.view.frame;

CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);
CGRect frame = CGRectMake(0.0, 0.0, width, height);

Not Preferred:

CGRect frame = self.view.frame;
CGFloat x = frame.origin.x;
CGFloat y = frame.origin.y;
CGFloat width = frame.size.width;
CGFloat height = frame.size.height;
CGRect frame = (CGRect){ .origin = CGPointZero, .size = frame.size };

Golden Path

Preferred:

- (void)someMethod {
  if (![someOther boolValue]) {
    return;
  }

  //Do something important
}

Not Preferred:

- (void)someMethod {
  if ([someOther boolValue]) {
    //Do something important
  }
}

錯誤處理

判斷返回值而不是錯誤變量拿诸。
Preferred:

NSError *error;
if (![self trySomethingWithError:&error]) {
  // Handle Error
}

Not Preferred:

NSError *error;
[self trySomethingWithError:&error];
if (error) {
  // Handle Error
}

單例模式

  • 使用線程安全方式創(chuàng)建實例扒袖。
+ (instancetype)sharedInstance {
  static id sharedInstance = nil;

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

  return sharedInstance;
}

換行符

一行代碼太長的話可以使用換行符,換成兩行佳镜。

self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];

down

self.productsRequest = [[SKProductsRequest alloc]     
    initWithProductIdentifiers:productIdentifiers];

  • 少用++ -- 運算符
  • 規(guī)范只是建議不要拘泥
  • 對于文章的大部分內容還是認同的僚稿,但是對于方法名(+/-)符號后添加空格,就個人而言感覺意義并不大蟀伸。

參考文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蚀同,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子啊掏,更是在濱河造成了極大的恐慌蠢络,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迟蜜,死亡現(xiàn)場離奇詭異刹孔,居然都是意外死亡,警方通過查閱死者的電腦和手機娜睛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門髓霞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人畦戒,你說我怎么就攤上這事方库。” “怎么了障斋?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵纵潦,是天一觀的道長。 經(jīng)常有香客問我垃环,道長邀层,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任遂庄,我火速辦了婚禮寥院,結果婚禮上,老公的妹妹穿的比我還像新娘涛目。我一直安慰自己只磷,他們只是感情好经磅,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钮追,像睡著了一般预厌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上元媚,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天轧叽,我揣著相機與錄音,去河邊找鬼刊棕。 笑死炭晒,一個胖子當著我的面吹牛,可吹牛的內容都是我干的甥角。 我是一名探鬼主播网严,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嗤无!你這毒婦竟也來了震束?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤当犯,失蹤者是張志新(化名)和其女友劉穎垢村,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚎卫,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡嘉栓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拓诸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侵佃。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖奠支,靈堂內的尸體忽然破棺而出馋辈,到底是詐尸還是另有隱情,我是刑警寧澤胚宦,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布首有,位于F島的核電站燕垃,受9級特大地震影響枢劝,放射性物質發(fā)生泄漏。R本人自食惡果不足惜卜壕,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一您旁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轴捎,春花似錦鹤盒、人聲如沸蚕脏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驼鞭。三九已至,卻和暖如春尺碰,著一層夾襖步出監(jiān)牢的瞬間挣棕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工亲桥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洛心,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓题篷,卻偏偏與公主長得像词身,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子番枚,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內容

  • Objective-C Coding Guidelines In Chinese Objective-C編碼規(guī)范法严,...
    爨鄉(xiāng)的云閱讀 494評論 0 0
  • 示例 下面是一個示例頭文件,演示了@interface聲明的正確注釋和間隔 一個示例源文件户辫,演示了一個接口的@ i...
    我是Damo閱讀 1,977評論 2 5
  • 轉載自:『博愛』 Objective-C-Coding-Guidelines-In-Chinese 概要 Obje...
    王_堯閱讀 1,190評論 0 2
  • 1.屬性命名 // 屬性命名:小駝峰+類型后綴 變量盡量以描述性的方式來命名渐夸。單個字符的變量命名應該盡量避免,除了...
    luxing123閱讀 317評論 0 0
  • OC代碼規(guī)范 一渔欢、代碼格式 1.1墓塌、使用空格而不是制表符Tab 不要在工程里使用 Tab 鍵,使用空格來進行縮進奥额。...
    whocare_閱讀 2,022評論 0 3