摘要
為了規(guī)范看準(zhǔn)iOS編碼而作。主要包含編碼格式和命名規(guī)范兩大章節(jié)。
在寫之前對下面所用的有些詞匯進(jìn)行一些約定:
- 方法 method:類,協(xié)議中國所定義的函數(shù)
- 函數(shù) function:
Difference between a method and a function
閱讀本文的時候,心中要有作用域概念,常量,函數(shù)的命名變化主要是因?yàn)樽饔糜虻牟煌朋w現(xiàn)出區(qū)別。
- 表達(dá)式作用域
- 塊作用域
- 函數(shù)作用域
- 文件作用域
- 模塊作用域
- 全局作用域
編碼格式
我們使用空格縮進(jìn)。你應(yīng)該將編輯器設(shè)置成自動將制表符替換成空格。
行寬
盡量讓你的代碼保持在120列之內(nèi)。
我們深知 Objective-C 是一門繁冗的語言,在某些情況下略超 120 列可能有助于提高可讀性,但這也只能是特例而已,不能成為開脫。
如果閱讀代碼的人認(rèn)為把把某行行寬保持在 120 列仍然有不失可讀性,你應(yīng)該按他們說的去做。
我們意識到這條規(guī)則是有爭議的,但很多已經(jīng)存在的代碼堅(jiān)持了本規(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ī)則適用于類聲明、實(shí)例變量以及方法聲明。例如:
@interface MyProtocoledClass : NSObject<NSWindowDelegate> {
@private
id<MyFancyDelegate> delegate_;
}
- (void)setDelegate:(id<MyFancyDelegate>)aDelegate;
@end
塊(閉包)
塊(block)適合用在 target/selector 模式下創(chuàng)建回調(diào)方法時,因?yàn)樗勾a更易讀。塊中的代碼應(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];
點(diǎn)語法
應(yīng)該 始終 使用點(diǎn)語法來訪問或者修改屬性,訪問其他實(shí)例時首選括號。
推薦:
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
在實(shí)現(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)為實(shí)例變量。
推薦:
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
,常量除外。 盡量定義屬性來代替直接使用實(shí)例變量。除了初始化方法(init
, initWithCoder:
,等), dealloc
方法和自定義的 setters 和 getters 內(nèi)部,應(yīng)避免直接訪問實(shí)例變量。更多有關(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)該放在實(shí)現(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
類的不可變實(shí)例時,都應(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àn)槌A靠梢暂p易重用并且可以快速改變而不需要查找和替換。常量應(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ī)范,因?yàn)樗哂懈鼜?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)該聲明在類實(shí)現(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)歸入各自的組中。
布爾
因?yàn)?nil
解析為 NO
,所以沒有必要在條件中與它進(jìn)行比較。永遠(yuǎn)不要直接和 YES
進(jìn)行比較,因?yà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)建共享的實(shí)例。
+ (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 項(xiàng)目文件同步。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“作為方法的一部分,因?yàn)橹鷦釉~[^6](auxiliary verbs)很少有實(shí)際意思。同樣,不要在動詞后面添加沒用的副詞[^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
實(shí)現(xiàn)操作時,優(yōu)先使用function實(shí)現(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變量、常量、通知。
聲明屬性和實(shí)例變量
屬性命名和屬性訪問命名一樣。
屬性盡可能減少聲明屬性。
-
如果屬性對外是
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] 紐約時報(bào) 移動團(tuán)隊(duì) Objective-C 規(guī)范指南
[2] Objective-C 風(fēng)格指南
[3] Coding Guidelines for Cocoa
[4] 自指
[5] 動名詞
[6] 助動詞
[7] 副詞