通用的約定
盡可能遵守 Apple 的命名約定芹啥,尤其是和 內(nèi)存管理規(guī)則 (NARC) 相關(guān)的地方绩鸣。
推薦使用長(zhǎng)的鼎文、描述性的方法和變量名。
推薦:
UIButton *settingsButton;
不推薦:
UIButton *setBut;
常量
常量應(yīng)該以駝峰法命名贬墩,并以相關(guān)類(lèi)名作為前綴榴嗅。
推薦:
static const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration = 0.4;
不推薦:
static const NSTimeInterval fadeOutTime = 0.4;
推薦使用常量來(lái)代替字符串字面值和數(shù)字,這樣能夠方便復(fù)用陶舞,而且可以快速修改而不需要查找和替換录肯。常量應(yīng)該用 static 聲明為靜態(tài)常量,而不要用 #define 吊说,除非它明確的作為一個(gè)宏來(lái)使用论咏。
推薦:
static NSString * const ZOCCacheControllerDidClearCacheNotification = @"ZOCCacheControllerDidClearCacheNotification";
static const CGFloat ZOCImageThumbnailHeight = 50.0f;
不推薦:
#define CompanyName @"Apple Inc."
#define magicNumber 42
常量應(yīng)該在頭文件中以這樣的形式暴露給外部:
extern NSString *const ZOCCacheControllerDidClearCacheNotification;
并在實(shí)現(xiàn)文件中為它賦值。
只有公有的常量才需要添加命名空間作為前綴颁井。盡管實(shí)現(xiàn)文件中私有常量的命名可以遵循另外一種模式厅贪,你仍舊可以遵循這個(gè)規(guī)則。
方法
方法名與方法類(lèi)型 (- /+ 符號(hào))之間應(yīng)該以空格間隔雅宾。方法段之間也應(yīng)該以空格間隔(以符合 Apple 風(fēng)格)养涮。參數(shù)前應(yīng)該總是有一個(gè)描述性的關(guān)鍵詞。
盡可能少用 "and" 這個(gè)詞眉抬。它不應(yīng)該用來(lái)闡明有多個(gè)參數(shù)贯吓,比如下面的 initWithWidth:height: 這個(gè)例子:
推薦:
- (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;
字面值
使用字面值來(lái)創(chuàng)建不可變的 NSString , NSDictionary , NSArray ,和 NSNumber 對(duì)象。注意不要將 nil 傳進(jìn) NSArray 和NSDictionary 里蜀变,因?yàn)檫@樣會(huì)導(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];
如果要用到這些類(lèi)的可變副本,我們推薦使用 NSMutableArray , NSMutableString 這樣的類(lèi)库北。
應(yīng)該避免下面這樣:
NSMutableArray *aMutableArray = [@[] mutableCopy];
上面這種書(shū)寫(xiě)方式的效率和可讀性的都存在問(wèn)題爬舰。
效率方面,一個(gè)不必要的不可變對(duì)象被創(chuàng)建后立馬被廢棄了寒瓦;雖然這并不會(huì)讓你的 App 變慢(除非這個(gè)方法被頻繁調(diào)用)情屹,但是確實(shí)沒(méi)必要為了少打幾個(gè)字而這樣做。
可讀性方面杂腰,存在兩個(gè)問(wèn)題:第一個(gè)問(wèn)題是當(dāng)你瀏覽代碼并看見(jiàn) @[] 的時(shí)候垃你,你首先聯(lián)想到的是 NSArray 實(shí)例,但是在這種情形下你需要停下來(lái)深思熟慮的檢查;另一個(gè)問(wèn)題是惜颇,一些新手以他的水平看到你的代碼后可能會(huì)對(duì)這是一個(gè)可變對(duì)象還是一個(gè)不可變對(duì)象產(chǎn)生分歧皆刺。他/她可能不熟悉可變拷貝構(gòu)造的含義(這并不是說(shuō)這個(gè)知識(shí)不重要)。當(dāng)然官还,不存在絕對(duì)的錯(cuò)誤芹橡,我們只是討論代碼的可用性(包括可讀性)毒坛。