盡可能遵守 Apple 的命名約定,尤其是和 內(nèi)存管理規(guī)則 (NARC) 相關(guān)的地方。
推薦使用長(zhǎng)的、描述性的方法和變量名
推薦:
UIButton *settingsButton;
不推薦:
UIButton *setBut;
常量應(yīng)該使用駝峰命名法,并且為了清楚,應(yīng)該用相關(guān)的類(lèi)名作為前綴。
推薦:
static const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration = 0.4;
不推薦:
static const NSTimeInterval fadeOutTime = 0.4;
常量應(yīng)該盡量使用 in-line 的字符串字面值或者數(shù)字,這樣便于經(jīng)常用到的時(shí)候復(fù)用,并且可以快速修改而不用查找和替換。 常量應(yīng)該用 static
聲明,并且不要使用 #define
,除非它就是明確作為一個(gè)宏來(lái)用的。
推薦:
static NSString * const ZOCCacheControllerDidClearCacheNotification = @"ZOCCacheControllerDidClearCacheNotification";
static const CGFloat ZOCImageThumbnailHeight = 50.0f;
不推薦:
#define CompanyName @"Apple Inc."
#define magicNumber 42
常量應(yīng)該在 interface 文件中這樣被聲明:
extern NSString *const ZOCCacheControllerDidClearCacheNotification;
并且應(yīng)該在實(shí)現(xiàn)文件中實(shí)現(xiàn)它的定義。
你只需要為公開(kāi)的常量添加命名空間前綴。即使私有常量在實(shí)現(xiàn)文件中可能以不同的模式使用,你也不需要堅(jiān)持這個(gè)規(guī)則了。
對(duì)于方法簽名,在方法類(lèi)型 (-
/+
符號(hào))后應(yīng)該要有一個(gè)空格。方法段之間也應(yīng)該有一個(gè)空格(來(lái)符合 Apple 的規(guī)范)。在參數(shù)名稱(chēng)之前總是應(yīng)該有一個(gè)描述性的關(guān)鍵詞。
使用“and”命名的時(shí)候應(yīng)當(dāng)更加謹(jǐn)慎。它不應(yīng)該用作闡明有多個(gè)參數(shù),比如下面的initWithWidth:height:
例子:
推薦:
- (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;
不推薦:
- (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.
NSString
, NSDictionary
, NSArray
, 和 NSNumber
字面值應(yīng)該用在任何創(chuàng)建不可變的實(shí)例對(duì)象。特別小心 nil
不能放進(jìn) NSArray
和 NSDictionary
里,這會(huì)導(dǎo)致 Crash。
例子:
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];
對(duì)于那些可變的副本,我們推薦使用明確的如 NSMutableArray
, NSMutableString
這些類(lèi)。
下面的例子 應(yīng)該被避免:
NSMutableArray *aMutableArray = [@[] mutableCopy];
上面的書(shū)寫(xiě)方式存在效率以及可讀性的問(wèn)題。效率方面,一個(gè)不必要的不可變變量被創(chuàng)建,并且馬上被廢棄了;這并不會(huì)讓你的 App 變得更慢(除非這個(gè)方法會(huì)被很頻繁地調(diào)用),但是確實(shí)沒(méi)必要為了少打幾個(gè)字而這樣做。對(duì)于可讀性來(lái)說(shuō),存在兩個(gè)問(wèn)題:第一個(gè)是當(dāng)瀏覽代碼并且看見(jiàn) @[]
的時(shí)候你的腦海里馬上會(huì)聯(lián)系到 NSArray
的實(shí)例,但是在這種情形下你需要停下來(lái)思考下。另一個(gè)方面,一些新手看到后可能會(huì)對(duì)可變和不可變對(duì)象的分歧感到不舒服。他/她可能對(duì)創(chuàng)造一個(gè)可變對(duì)象的副本不是很熟悉(當(dāng)然這并不是說(shuō)這個(gè)知識(shí)不重要)。當(dāng)然,這并不是說(shuō)存在絕對(duì)的錯(cuò)誤,只是可用性(包括可讀性)有一些問(wèn)題。
更多建議: