iOS 編碼規(guī)范

摘要

為了規(guī)范看準(zhǔn)iOS編碼而作草穆。主要包含編碼格式和命名規(guī)范兩大章節(jié)。

在寫之前對下面所用的有些詞匯進(jìn)行一些約定:

  • 方法 method:類雕旨,協(xié)議中國所定義的函數(shù)
  • 函數(shù) function:

Difference between a method and a function

閱讀本文的時候扮匠,心中要有作用域概念,常量凡涩,函數(shù)的命名變化主要是因為作用域的不同才體現(xiàn)出區(qū)別棒搜。

  • 表達(dá)式作用域
  • 塊作用域
  • 函數(shù)作用域
  • 文件作用域
  • 模塊作用域
  • 全局作用域

編碼格式

我們使用空格縮進(jìn)。你應(yīng)該將編輯器設(shè)置成自動將制表符替換成空格活箕。

行寬

盡量讓你的代碼保持在120列之內(nèi)力麸。

我們深知 Objective-C 是一門繁冗的語言,在某些情況下略超 120 列可能有助于提高可讀性育韩,但這也只能是特例而已克蚂,不能成為開脫。

如果閱讀代碼的人認(rèn)為把把某行行寬保持在 120 列仍然有不失可讀性筋讨,你應(yīng)該按他們說的去做埃叭。

我們意識到這條規(guī)則是有爭議的,但很多已經(jīng)存在的代碼堅持了本規(guī)則悉罕,我們覺得保證一致性更重要赤屋。

通過設(shè)置 Xcode > Preferences > Text Editing > Show page guide立镶,來使越界更容易被發(fā)現(xiàn)。

方法聲明和定義

- + 和返回類型之間須使用一個空格类早,參數(shù)列表中只有參數(shù)之間可以有空格媚媒。

方法應(yīng)該像這樣:

- (void)doSomethingWithString:(NSString *)theString {
  ...
}

如果一行有非常多的參數(shù),更好的方式是將每個參數(shù)單獨(dú)拆成一行涩僻。如果使用多行缭召,將每個參數(shù)前的冒號對齊。

- (void)doSomethingWith:(GTMFoo *)theFoo
                   rect:(NSRect)theRect
               interval:(float)theInterval {
  ...
}

當(dāng)?shù)谝粋€關(guān)鍵字比其它的短時逆日,保證下一行至少有 4 個空格的縮進(jìn)嵌巷。這樣可以使關(guān)鍵字垂直對齊,而不是使用冒號對齊:

- (void)short:(GTMFoo *)theFoo
    longKeyword:(NSRect)theRect
    evenLongerKeyword:(float)theInterval {
  ...
}

方法調(diào)用

方法調(diào)用應(yīng)盡量保持與方法聲明的格式一致屏富。當(dāng)格式的風(fēng)格有多種選擇時晴竞,新的代碼要與已有代碼保持一致。

調(diào)用時所有參數(shù)應(yīng)該在同一行:

[myObject doFooWith:arg1 name:arg2 error:arg3];

或者每行一個參數(shù)狠半,以冒號對齊:

[myObject doFooWith:arg1
               name:arg2
              error:arg3];

不要使用下面的縮進(jìn)風(fēng)格:

[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];

方法定義與方法聲明一樣噩死,當(dāng)關(guān)鍵字的長度不足以以冒號對齊時,下一行都要以四個空格進(jìn)行縮進(jìn)神年。

[myObj short:arg1
    longKeyword:arg2
    evenLongerKeyword:arg3];

@public@private

@public@private 訪問修飾符應(yīng)該左對齊已维。

@interface MyClass : NSObject {
@public
  ...
@private
  ...
}

@end

異常

每個 @ 標(biāo)簽應(yīng)該有獨(dú)立的一行,在 @{} 之間需要有一個空格已日, @catch 與被捕捉到的異常對象的聲明之間也要有一個空格垛耳。

如果你決定使用 Objective-C 的異常,那么就按下面的格式飘千。不過你最好先看看 避免拋出異常 了解下為什么不要使用異常堂鲜。

@try {
  foo();
}
@catch (NSException *ex) {
  bar(ex);
}
@finally {
  baz();
}

協(xié)議名

類型標(biāo)識符和尖括號內(nèi)的協(xié)議名之間,不能有任何空格护奈。

這條規(guī)則適用于類聲明缔莲、實例變量以及方法聲明。例如:

@interface MyProtocoledClass : NSObject<NSWindowDelegate> {
@private
  id<MyFancyDelegate> delegate_;
}
- (void)setDelegate:(id<MyFancyDelegate>)aDelegate;
@end

塊(閉包)

塊(block)適合用在 target/selector 模式下創(chuàng)建回調(diào)方法時霉旗,因為它使代碼更易讀痴奏。塊中的代碼應(yīng)該縮進(jìn) 4 個空格。

取決于塊的長度厌秒,下列都是合理的風(fēng)格準(zhǔn)則:

  • 關(guān)括號應(yīng)與塊聲明的第一個字符對齊读拆。
  • 塊內(nèi)的代碼須按 4 空格縮進(jìn)。
  • 如果塊太長鸵闪,比如超過 20 行檐晕,建議把它定義成一個局部變量,然后再使用該變量蚌讼。
  • 如果塊不帶參數(shù)棉姐,^{ 之間無須空格屠列。如果帶有參數(shù),^( 之間無須空格伞矩,但 ) { 之間須有一個空格。
// The entire block fits on one line.
[operation setCompletionBlock:^{ 
    [self onOperationDone]; 
}];

// The block can be put on a new line, indented four spaces, with the
// closing brace aligned with the first character of the line on which
// block was declared.
[operation setCompletionBlock:^{
    [self.delegate newDataAvailable];
}];

// Using a block with a C API follows the same alignment and spacing
// rules as with Objective-C.
dispatch_async(fileIOQueue_, ^{
    NSString* path = [self sessionFilePath];
    if (path) {
      // ...
    }
});

// An example where the parameter wraps and the block declaration fits
// on the same line. Note the spacing of |^(SessionWindow *window) {|
// compared to |^{| above.
[[SessionService sharedService]
    loadWindowWithCompletionBlock:^(SessionWindow *window) {
        if (window) {
          [self windowDidLoad:window];
        } else {
          [self errorLoadingWindow];
        }
    }];

// An example where the parameter wraps and the block declaration does
// not fit on the same line as the name.
[[SessionService sharedService]
    loadWindowWithCompletionBlock:
        ^(SessionWindow *window) {
            if (window) {
              [self windowDidLoad:window];
            } else {
              [self errorLoadingWindow];
            }
        }];

// Large blocks can be declared out-of-line.
void (^largeBlock)(void) = ^{
    // ...
};
[operationQueue_ addOperationWithBlock:largeBlock];

點語法

應(yīng)該 始終 使用點語法來訪問或者修改屬性夏志,訪問其他實例時首選括號乃坤。

推薦:

view.backgroundColor = [UIColor orangeColor];
[UIApplication sharedApplication].delegate;

反對:

[view setBackgroundColor:[UIColor orangeColor]];
UIApplication.sharedApplication.delegate;

間距

  • 一個縮進(jìn)使用 4 個空格,永遠(yuǎn)不要使用制表符(tab)縮進(jìn)沟蔑。請確保在 Xcode 中設(shè)置了此偏好湿诊。
  • 方法的大括號和其他的大括號(if/else/switch/while 等等)始終和聲明在同一行開始,在新的一行結(jié)束瘦材。

推薦:

if (user.happy) {
    // Do something
    dfksfaf\fa
    fdsfafsa
} 
else {
    // Do something else
}
  • 方法之間應(yīng)該正好空一行厅须,這有助于視覺清晰度和代碼組織性。在方法中的功能塊之間應(yīng)該使用空白分開食棕,但往往可能應(yīng)該創(chuàng)建一個新的方法朗和。

    - (void)do {
      module1
      
      module2
    }
    

    ?

  • @synthesize@dynamic 在實現(xiàn)中每個都應(yīng)該占一個新行。

條件判斷

條件判斷主體部分應(yīng)該始終使用大括號括住來防止出錯簿晓,即使它可以不用大括號(例如它只需要一行)眶拉。這些錯誤包括添加第二行(代碼)并希望它是 if 語句的一部分時。當(dāng) if 語句里面的一行被注釋掉憔儿,下一行就會在不經(jīng)意間成為了這個 if 語句的一部分忆植。此外,這種風(fēng)格也更符合所有其他的條件判斷谒臼,因此也更容易檢查朝刊。

推薦:

if (!error) {
    return success;
}

反對:

if (!error)
    return success;

if (!error) { return success };

三目運(yùn)算符

三目運(yùn)算符,? 蜈缤,只有當(dāng)它可以增加代碼清晰度或整潔時才使用拾氓。單一的條件都應(yīng)該優(yōu)先考慮使用。多條件時通常使用 if 語句會更易懂劫樟,或者重構(gòu)為實例變量痪枫。

推薦:

result = a > b ? x : y;

反對:

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

錯誤處理

當(dāng)引用一個返回錯誤參數(shù)(error parameter)的方法時,應(yīng)該針對返回值叠艳,而非錯誤變量奶陈。

推薦:

NSError *error;
if (![self trySomethingWithError:&error]) {
    // 處理錯誤
}

反對:

NSError *error;
[self trySomethingWithError:&error];
if (error) {
    // 處理錯誤
}

一些蘋果的 API 在成功的情況下會寫一些垃圾值給錯誤參數(shù)(如果非空),所以針對錯誤變量可能會造成虛假結(jié)果(以及接下來的崩潰)附较。

方法

在方法簽名中吃粒,在 -/+ 符號后應(yīng)該有一個空格。方法片段之間也應(yīng)該有一個空格拒课。

推薦:

- (void)setExampleText:(NSString *)text image:(UIImage *)image;

變量

變量名應(yīng)該盡可能命名為描述性的徐勃。除了 for() 循環(huán)外事示,其他情況都應(yīng)該避免使用單字母的變量名。 星號表示指針屬于變量僻肖,例如:NSString *text 不要寫成 NSString* text 或者 NSString * text 肖爵,常量除外。 盡量定義屬性來代替直接使用實例變量臀脏。除了初始化方法(init劝堪, initWithCoder:,等)揉稚, dealloc 方法和自定義的 setters 和 getters 內(nèi)部秒啦,應(yīng)避免直接訪問實例變量。更多有關(guān)在初始化方法和 dealloc 方法中使用訪問器方法的信息搀玖,參見這里余境。

推薦:

@interface NYTSection: NSObject

@property (strong, nonatomic) NSString *headline;

@end

反對:

@interface NYTSection : NSObject {
    NSString *headline;
}

變量限定符

當(dāng)涉及到在 ARC 中被引入變量限定符時, 限定符 (__strong, __weak, __unsafe_unretained, __autoreleasing) 應(yīng)該位于變量類型之前灌诅,

如:__weak NSString * text芳来。

init 和 dealloc

dealloc 方法應(yīng)該放在實現(xiàn)文件的最上面,并且剛好在 @synthesize@dynamic 語句的后面延塑。在任何類中绣张,init 都應(yīng)該直接放在 dealloc 方法的下面。

init 方法的結(jié)構(gòu)應(yīng)該像這樣:

- (instancetype)init {
    if (self = [super init]) {
        // Custom initialization
    }

    return self;
}

字面量

每當(dāng)創(chuàng)建 NSString关带, NSDictionary侥涵, NSArray,和 NSNumber 類的不可變實例時宋雏,都應(yīng)該使用字面量芜飘。要注意 nil 值不能傳給 NSArrayNSDictionary 字面量,這樣做會導(dǎo)致崩潰磨总。

推薦:

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

反對:

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 *buildingZIPCode = [NSNumber numberWithInteger:10018];

CGRect 函數(shù)

當(dāng)訪問一個 CGRectx嗦明, ywidth蚪燕, height 時娶牌,應(yīng)該使用CGGeometry 函數(shù)代替直接訪問結(jié)構(gòu)體成員。蘋果的 CGGeometry 參考中說到:

All functions described in this reference that take CGRect data structures as inputs implicitly standardize those rectangles before calculating their results. For this reason, your applications should avoid directly reading and writing the data stored in the CGRect data structure. Instead, use the functions described here to manipulate rectangles and to retrieve their characteristics.

推薦:

CGRect frame = self.view.frame;

CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);

反對:

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;

常量

常量首選內(nèi)聯(lián)字符串字面量或數(shù)字馆纳,因為常量可以輕易重用并且可以快速改變而不需要查找和替換诗良。常量應(yīng)該聲明為 static 常量而不是 #define ,除非非常明確地要當(dāng)做宏來使用鲁驶。

推薦:

static NSString * const NYTAboutViewControllerCompanyName = @"The New York Times Company";

static const CGFloat NYTImageThumbnailHeight = 50.0;

反對:

#define CompanyName @"The New York Times Company"

#define thumbnailHeight 2

枚舉類型

當(dāng)使用 enum 時鉴裹,建議使用新的基礎(chǔ)類型規(guī)范,因為它具有更強(qiáng)的類型檢查和代碼補(bǔ)全功能。現(xiàn)在 SDK 包含了一個宏來鼓勵使用使用新的基礎(chǔ)類型 - NS_ENUM()

推薦:

typedef NS_ENUM(NSInteger, NYTAdRequestState) {
    NYTAdRequestStateInactive,
    NYTAdRequestStateLoading
};

位掩碼

當(dāng)用到位掩碼時径荔,使用 NS_OPTIONS 宏督禽。

舉例:

typedef NS_OPTIONS(NSUInteger, NYTAdCategory) {
    NYTAdCategoryAutos      = 1 << 0,
    NYTAdCategoryJobs       = 1 << 1,
    NYTAdCategoryRealState  = 1 << 2,
    NYTAdCategoryTechnology = 1 << 3
};

私有屬性

私有屬性應(yīng)該聲明在類實現(xiàn)文件的延展(匿名的類目)中。

推薦:

@interface NYTAdvertisement ()

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

@end

圖片命名

圖片名稱應(yīng)該被統(tǒng)一命名以保持組織的完整总处。它們應(yīng)該被命名為一個說明它們用途的駝峰式字符串狈惫,其次是自定義類或?qū)傩缘臒o前綴名字(如果有的話),然后進(jìn)一步說明顏色 和/或 展示位置辨泳,最后是它們的狀態(tài)虱岂。

推薦:

  • RefreshBarButtonItem / RefreshBarButtonItem@2xRefreshBarButtonItemSelected / RefreshBarButtonItemSelected@2x
  • ArticleNavigationBarWhite / ArticleNavigationBarWhite@2xArticleNavigationBarBlackSelected / ArticleNavigationBarBlackSelected@2x.

圖片目錄中被用于類似目的的圖片應(yīng)歸入各自的組中。

布爾

因為 nil 解析為 NO菠红,所以沒有必要在條件中與它進(jìn)行比較。永遠(yuǎn)不要直接和 YES 進(jìn)行比較难菌,因為 YES 被定義為 1试溯,而 BOOL 可以多達(dá) 8 位。

這使得整個文件有更多的一致性和更大的視覺清晰度郊酒。

推薦:

if (!someObject) {
}

反對:

if (someObject == nil) {
}

對于 BOOL 來說, 這有兩種用法:

if (isAwesome)
if (![someObject boolValue])

反對:

if ([someObject boolValue] == NO)
if (isAwesome == YES) // 永遠(yuǎn)別這么做

如果一個 BOOL 屬性名稱是一個形容詞遇绞,屬性可以省略 “is” 前綴,但為 get 訪問器指定一個慣用的名字燎窘,例如:

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

內(nèi)容和例子來自 Cocoa 命名指南 摹闽。

單例

單例對象應(yīng)該使用線程安全的模式創(chuàng)建共享的實例。

+ (instancetype)sharedInstance {
    static id sharedInstance = nil;

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

    return sharedInstance;
}

這將會預(yù)防有時可能產(chǎn)生的許多崩潰褐健。

導(dǎo)入

如果有一個以上的 import 語句付鹿,就對這些語句進(jìn)行分組。每個分組的注釋是可選的蚜迅。
注:對于模塊使用 @import 語法舵匾。

// Frameworks
@import QuartzCore;

// Models
#import "NYTUser.h"

// Views
#import "NYTButton.h"
#import "NYTUserView.h"

Xcode 工程

為了避免文件雜亂,物理文件應(yīng)該保持和 Xcode 項目文件同步谁不。Xcode 創(chuàng)建的任何組(group)都必須在文件系統(tǒng)有相應(yīng)的映射坐梯。為了更清晰,代碼不僅應(yīng)該按照類型進(jìn)行分組刹帕,也可以根據(jù)功能進(jìn)行分組吵血。

如果可以的話,盡可能一直打開 target Build Settings 中 "Treat Warnings as Errors" 以及一些額外的警告偷溺。如果你需要忽略指定的警告,使用 Clang 的編譯特性 蹋辅。

命名和使用原則

不允許使用自定義的縮寫

推薦:

UIButton *settingsButton;

反對:

UIButton *setBut;

通用原則

清晰 Clarity

  • 命名應(yīng)該盡可能的清晰簡潔

  • 通常亡蓉,不要使用縮寫晕翠,即使是名字很長。

    setBackgroundColor: / setBkgdColor:
    destinationSelection / destSel
    

    你通常認(rèn)為的縮寫(abbreviation [??briv?'e??n]),并不能清晰的表達(dá)其你想表達(dá)的意思淋肾。不同文化和語言背景上其所代表的意思會截然不同硫麻。

  • 然而,一些通用且歷史悠久的縮寫樊卓,是可以使用拿愧。Acceptable Abbreviations and Acronyms

  • 避免在API中使用含糊不清的命名,比如方法名:

    Code Commentary
    sendPort 這是一個發(fā)送操作還是返回一個端口
    displayName 這是一個顯示操作還是返回一個name

    ?

一致性 Consistency

  • 使用和Cocoa programmatic interfaces一致的命名碌尔,如果不確定可以參考浇辜,參考文檔的頭文件。

  • 一致性的重要性也體現(xiàn)在唾戚,一個類的多態(tài)上柳洋。同一個操作在不同類中,函數(shù)命名應(yīng)當(dāng)是一致的叹坦。

    i.e.- (NSInteger)tag setValue:

非自指 No Self Reference

  • 命名不應(yīng)當(dāng)自指熊镣。

    NSString       Good.
    NSStringObject     Self-referential.
    
  • 常量/枚舉是個例外,Constants應(yīng)當(dāng)能自己表達(dá)自身意思募书。

前綴 Prefixes

Objective-C沒有命名空間绪囱,Prefixes一定程度上用作命名空間。解決命名沖突莹捡。

  • prefix由兩個或者三個大寫字母構(gòu)成鬼吵。
  • prefix用于定義classes、protocols篮赢、functions齿椅、constants和typedef structures中時候。
  • 不要用在定義methods荷逞,方法已經(jīng)存在于類的命名空間媒咳,也不要用在 fields定義中。

類和協(xié)議的命名

一個類命名應(yīng)當(dāng)包含一個名詞(noun)能夠清晰的表示類种远。也應(yīng)該有合適的prefix涩澡。Foundation和Frameworks都是很好的例子。

協(xié)議(protocols)的命名應(yīng)當(dāng)和它所包含的一組行為相符合坠敷。

  • 大部分協(xié)議中的方法妙同,不應(yīng)該和特定的類關(guān)聯(lián)(是一組行為抽象)。協(xié)議和類的命名不應(yīng)該讓人產(chǎn)生困惑膝迎。一個通用的做法是協(xié)議用動名詞(gerund[^5] ..ing)形式:

    代碼 說明
    NSLocking Good.
    NSLock Poor(像是一個類)
  • 有些協(xié)議包含一些不相關(guān)的methods(原則上應(yīng)當(dāng)分成若干小協(xié)議)粥帚。

    NSObject

方法命名 Nameing Methods

本節(jié)討論方法命名。

通用規(guī)則

在命名方法的時候限次,有一些通用的指導(dǎo)方針需要遵守:

  • 小寫字母開頭之后的單詞首字母大寫(小駝峰式命名)芒涡,不需要前綴柴灯。有兩個例外:

    • 當(dāng)方法是well-known acronym 開頭的時候字母不小寫。
    • 在命名私有方法或者分組一類方法的時候可以帶前綴费尽。
  • 當(dāng)方法表示一個動作(action)的時候赠群,方法名動詞(verb)開頭。

    - (void)invokeWithTarget:(id)target;
    - (void)selectTabViewItem:(NSTabViewItem *)tabViewItem
    

    不要使用“do”或者”does“作為方法的一部分旱幼,因為助動詞[^6](auxiliary verbs)很少有實際意思查描。同樣,不要在動詞后面添加沒用的副詞[^7]和形容詞柏卤。

  • 如果方法返回一個receiver的屬性冬三,方法名字緊跟attribute之后。不要使用“get”缘缚,除非間接的返回一個或者多個值

    - (NSSize)cellSize;   ??
    - (NSSize)calcCellSize;
    - (NSSize)getCellSize;
    
  • 方法不可忽略lable

  • 參數(shù)前面應(yīng)當(dāng)有描述其意的單詞

    - (id)viewWithTag:(NSInteger)aTag;  ??
    - (id)taggedView:(int)aTag;
    
  • 在參數(shù)label中不要使用“and”

  • 如果方法描述兩個分開的action勾笆,用“and”連接

    - (BOOL)openFile:(NSString *)fullPath withApplication:(NSString *)appName andDeactivate:(BOOL)flag;
    

訪問方法 Accessor Methods

  • 屬性表達(dá)式為名詞:

    - (type)noun;

    - (void)setNoun:(type)aNoun;

    例如:

    - (NSString *)title;
    - (void)setTitle:(NSString *)aTitle;
    
  • 屬性表達(dá)式為形容詞:

    - (type)isAdjective;

    - (void)setAdjective:(BOOL)flag;

    例如:

    - (BOOL)isEditable;
    - (void)setEditable:(BOOL)flag;
    
  • 屬性表達(dá)式為動詞:

    - (type)verbObject;

    - (void)setVerbObject:(BOOL)flag;

    例如:

    - (BOOL)showsAlpha;
    - (void)setShowsAlpha:(BOOL)flag;
    

    動詞通常用現(xiàn)在時。

  • 使用情態(tài)動詞(modal verbs)像“can","should","will"桥滨,使命名更加清晰匠襟,但是不要使用do/does。

    - (void)setCanHide:(BOOL)flag;
    - (BOOL)canHide;
    - (void)setShouldCloseDocument:(BOOL)flag;
    - (BOOL)shouldCloseDocument;
    
    - (void)setDoesAcceptGlyphInfo:(BOOL)flag;
    - (BOOL)doesAcceptGlyphInfo;
    
  • 僅僅在間接返回對象/值的時候使用“get”该园,

    - (void)getLineDash:(float *)pattern count:(int *)count phase:(float *)phase;
    NSBezierPath.
    

    ?

委托方法 Delegate Methods

委托方法是指當(dāng)確定事件發(fā)生的時候調(diào)用相應(yīng)的方法的方法。委托方法有特有的格式帅韧,data source 也遵循這一格式里初。

  • 方法名字以發(fā)送消息的類開始。

    - (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row;
    - (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename;
    

    省略前綴忽舟,且第一個字母小寫双妨。

  • 當(dāng)委托方法只有一個參數(shù)的時:

    - (BOOL)applicationOpenUntitledFile:(NSApplication *)sender;
    
  • 使用“did”,“will”表示時間發(fā)生了或者將要發(fā)生叮阅。

  • “should” 詢問時間是否發(fā)生刁品。

    - (BOOL)windowShouldClose:(id)sender;
    

    ?

方法參數(shù)

  • 方法參數(shù)不允許出現(xiàn) point、ptr 浩姥、btn等縮寫挑随。

私有方法

  • 是有方法不允許下劃線開頭。
  • 如果要指明類型可以添加前綴sp_xxxxx.

函數(shù)命名

當(dāng)可以使用class methods & singleton 實現(xiàn)操作時勒叠,優(yōu)先使用function實現(xiàn)兜挨。

  • 函數(shù)命名規(guī)則遵從方法的命名規(guī)則,但是有一些區(qū)別:

    • 函數(shù)開頭要添加prefix眯分。
    • 首字母大寫拌汇。
  • 大部分函數(shù)以動詞(verb)開頭,描述其行為:

    NSHighlightRect
    NSDeallocateObject
    

當(dāng)函數(shù)是獲取屬性的時候弊决,遵循如下規(guī)則:

  • 如果函數(shù)返回的是其第一個參數(shù)的某一屬性則省略動詞噪舀。

    unsigned int NSEventMaskFromType(NSEventType type)
    float NSHeight(NSRect aRect)
    
  • 如果函數(shù)是通過引用返回,則需要使用Get

    const char *NSGetSizeAndAlignment(const char *typePtr, unsigned int *sizep, unsigned int *alignp)
    

屬性(property)和常量

此節(jié)描述聲明屬性与倡、instance變量界逛、常量、通知蒸走。

聲明屬性和實例變量

  • 屬性命名和屬性訪問命名一樣仇奶。

  • 屬性盡可能減少聲明屬性。

  • 如果屬性對外是readonly的屬性聲明中必須體現(xiàn)比驻。

    @property (strong, readonly) NSString *title;
    

常量

常量作用于常掣盟荩跨模塊,所以命名空間尤為重要别惦。

常量聲明使用const不允許使用#define

枚舉常量

枚舉常量定義必須指定類型, 推舉使用NS_ENUM

typedef NS_ENUM(NSUInteger, <#MyEnum#>) {
    <#MyEnumValueA#>,
    <#MyEnumValueB#>,
    <#MyEnumValueC#>,
};

用const定義常量

const 常量命名參考function命名

Notifications命名

格式:

[Name of associated class] + [Did | Will] + [UniquePartOfName] + Notification

example:
NSApplicationDidBecomeActiveNotification
NSWindowDidMiniaturizeNotification
NSTextViewDidChangeSelectionNotification
NSColorPanelColorDidChangeNotification

參考

[1] 紐約時報 移動團(tuán)隊 Objective-C 規(guī)范指南
[2] Objective-C 風(fēng)格指南
[3] Coding Guidelines for Cocoa
[4] 自指
[5] 動名詞
[6] 助動詞
[7] 副詞

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狈茉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掸掸,更是在濱河造成了極大的恐慌氯庆,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扰付,死亡現(xiàn)場離奇詭異堤撵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)羽莺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門实昨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盐固,你說我怎么就攤上這事荒给。” “怎么了刁卜?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵志电,是天一觀的道長。 經(jīng)常有香客問我蛔趴,道長挑辆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任夺脾,我火速辦了婚禮之拨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咧叭。我一直安慰自己蚀乔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布菲茬。 她就那樣靜靜地躺著吉挣,像睡著了一般派撕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睬魂,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天终吼,我揣著相機(jī)與錄音,去河邊找鬼氯哮。 笑死际跪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的喉钢。 我是一名探鬼主播姆打,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肠虽!你這毒婦竟也來了幔戏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤税课,失蹤者是張志新(化名)和其女友劉穎闲延,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體韩玩,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垒玲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了找颓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侍匙。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖叮雳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情妇汗,我是刑警寧澤帘不,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站杨箭,受9級特大地震影響寞焙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜互婿,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一捣郊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慈参,春花似錦呛牲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽着茸。三九已至,卻和暖如春琐旁,著一層夾襖步出監(jiān)牢的瞬間涮阔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工灰殴, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留敬特,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓牺陶,卻偏偏與公主長得像伟阔,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子义图,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

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

  • 一.代碼命名 一般性原則 最好是既清晰又簡短减俏,但不要為簡短而喪失清晰性。 例如:removeObject:AtIn...
    睡不完懶覺閱讀 1,777評論 0 16
  • Object-C 開發(fā)代碼規(guī)范概要Object-C是一門面向?qū)ο蟮膭討B(tài)編程語言碱工,主要用于編寫IOS和MAC應(yīng)用程序...
    克魯?shù)吕?/span>閱讀 534評論 0 1
  • 注:本文轉(zhuǎn)載自http://www.cocoachina.com/ios/20150908/13335.html娃承,...
    Sevenuncle閱讀 558評論 0 0
  • 面試被問到公司編碼規(guī)范問題,感覺有很多東西怕篷,但是不知道該怎么說出來历筝,今天突然找到 李明杰 老師的一份編碼規(guī)范。重新...
    Dombo_Y閱讀 967評論 1 2
  • 作為威海人是一件非常幸福的事廊谓,中國海文學(xué)院總經(jīng)理敏子老師帶著導(dǎo)師團(tuán)隊一行5人到威海巨獻(xiàn)《在關(guān)系中修行———界限...
    美樂泓予閱讀 173評論 0 0