摘要
為了規(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
值不能傳給 NSArray
和 NSDictionary
字面量,這樣做會導(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)訪問一個 CGRect
的 x
嗦明, y
, width
蚪燕, 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@2x
和RefreshBarButtonItemSelected
/RefreshBarButtonItemSelected@2x
-
ArticleNavigationBarWhite
/ArticleNavigationBarWhite@2x
和ArticleNavigationBarBlackSelected
/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] 副詞