精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

iOS應(yīng)用開(kāi)發(fā)最佳實(shí)踐:編寫(xiě)高質(zhì)量Objective-C代碼

移動(dòng)開(kāi)發(fā) iOS
無(wú)論你是iOS開(kāi)發(fā)的菜鳥(niǎo)還是有一定經(jīng)驗(yàn)的老手,都可以來(lái)學(xué)習(xí)一下關(guān)于如何提高編程代碼質(zhì)量的問(wèn)題,保持良好的編程習(xí)慣對(duì)你的代碼有很大的幫助。

[[90977]]

點(diǎn)標(biāo)記語(yǔ)法

屬性和冪等方法(多次調(diào)用和一次調(diào)用返回的結(jié)果相同)使用點(diǎn)標(biāo)記語(yǔ)法訪(fǎng)問(wèn),其他的情況使用方括號(hào)標(biāo)記語(yǔ)法。

良好的風(fēng)格:

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

不良的風(fēng)格:

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

間距

二元運(yùn)算符和參數(shù)之間需要放置一個(gè)空格,一元運(yùn)算符、強(qiáng)制類(lèi)型轉(zhuǎn)換和參數(shù)之間不放置空格。關(guān)鍵字之后圓括號(hào)之前需要放置一個(gè)空格。

  1. void *ptr = &value + 10 * 3; 
  2. NewType a = (NewType)b; 
  3. for (int i = 0; i < 10; i++) { 
  4.     doCoolThings(); 

數(shù)組和字典類(lèi)型的字面值的方括號(hào)兩邊各放置一個(gè)空格。

  1. NSArray *theShit = @[ @1, @2, @3 ]; 

字典字面值的鍵和冒號(hào)之間沒(méi)有空格,冒號(hào)和值之間有一個(gè)空格。

  1. NSDictionary *keyedShit = @{ GHDidCreateStyleGuide: @YES }; 

C函數(shù)聲明中,左括號(hào)的前面不保留空格,并且函數(shù)名應(yīng)該像類(lèi)一樣帶有命名空間標(biāo)識(shí)。

良好的風(fēng)格:

  1. void RNCwesomeFunction(BOOL hasSomeArgs); 

長(zhǎng)的字面值應(yīng)被拆分為多行。

良好的風(fēng)格:

  1. NSArray *theShit = @[ 
  2.     @"Got some long string objects in here."
  3.     [AndSomeModelObjects too], 
  4.     @"Moar strings." 
  5. ]; 
  6. NSDictionary *keyedShit = @{ 
  7.     @"this.key": @"corresponds to this value"
  8.     @"otherKey": @"remoteData.payload"
  9.     @"some": @"more"
  10.     @"JSON": @"keys"
  11.     @"and": @"stuff"
  12. }; 

每一行代碼使用4個(gè)空格縮進(jìn)。不使用tab縮進(jìn)。下圖是在Xcode的Preferences進(jìn)行縮進(jìn)設(shè)置的截圖。

方法簽名以及其他關(guān)鍵字(if/else/switch/while等)后面跟隨的左花括號(hào)總是和語(yǔ)句出現(xiàn)于同一行,而右花括號(hào)獨(dú)占一行。

良好的風(fēng)格:

  1. if (user.isHappy) { 
  2. //Do something 
  3. else { 
  4. //Do something else 

如果一個(gè)方法內(nèi)有多個(gè)功能區(qū)域,可以使用空行分隔功能區(qū)域。

每一行代碼不要超過(guò)100個(gè)字符。

每一個(gè)方法之前都有一個(gè)99字符寬的注釋行,注釋行相對(duì)于使用空行更能提高代碼的辨識(shí)度,當(dāng)一行代碼很長(zhǎng)的時(shí)候,注釋行也起到了越界檢測(cè)的作用。注釋行:

////////////////////////////////////////////////////

下頁(yè)內(nèi)容更精彩

#p#

條件語(yǔ)句

所有的邏輯塊必須使用花括號(hào)包圍,即使條件體只需編寫(xiě)一行代碼也必須使用花括號(hào)。

良好的風(fēng)格做法:

  1. if (!error) { 
  2.     return success; 

不良的風(fēng)格:

  1. if (!error) 
  2.     return success; 

或:

  1. if (!error) return success; 

三元運(yùn)算符

長(zhǎng)的三元運(yùn)算符應(yīng)使用圓括號(hào)括起來(lái)。三元運(yùn)算符僅用于賦值和做參數(shù)。

  1. Blah *a = (stuff == thing ? foo : bar); 

合并的nil三元運(yùn)算符應(yīng)該盡量避免。

不良的風(fēng)格:

  1. Blah *b = thingThatCouldBeNil ?: defaultValue; 

多分支條件應(yīng)該使用if語(yǔ)句或重構(gòu)為實(shí)例變量。

良好的風(fēng)格:

result = a > b ? x : y;

不良的風(fēng)格:

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

異常和錯(cuò)誤處理

不要在流控制語(yǔ)句中使用異常(NSException)。

異常僅用于表明程序員的錯(cuò)誤。

為了表明一個(gè)錯(cuò)誤,使用NSError *。

當(dāng)一個(gè)方法通過(guò)引用返回一個(gè)錯(cuò)誤參數(shù),應(yīng)該檢測(cè)返回值的狀態(tài),而不是錯(cuò)誤參數(shù)的狀態(tài)。

良好的風(fēng)格

  1. NSError *error; 
  2. if (![self trySomethingWithError:&error]) { 
  3.     // Handle Error 

不良的風(fēng)格

  1. NSError *error; 
  2. [self trySomethingWithError:&error]; 
  3. if (error) { 
  4.     // Handle Error 

在方法執(zhí)行成功的情況下賦值非Null值給錯(cuò)誤參數(shù),會(huì)使路徑跳轉(zhuǎn)到假條件分支(隨后程序奔潰)。

代理

除了繼承一個(gè)類(lèi)或?qū)崿F(xiàn)一個(gè)協(xié)議,否則在頭文件中僅使用類(lèi)聲明@class指令,不用#import導(dǎo)入類(lèi)頭文件。

如果一個(gè)delegate只有幾個(gè)方法,比如只是提交和取消,推薦使用block編寫(xiě)動(dòng)作響應(yīng)代碼。

由于代理方法的聲明一般都很長(zhǎng),所以必須將代理對(duì)象和其他的協(xié)議對(duì)象放在實(shí)例變量定義的下面,否則實(shí)例變量定義的對(duì)齊方式將會(huì)被打亂掉。

當(dāng)需要實(shí)現(xiàn)多個(gè)協(xié)議的時(shí)候,將每一個(gè)協(xié)議名拆分到單獨(dú)的行。

良好的風(fēng)格:

  1. @interface CustomModelViewController : TTViewController < 
  2.   TTModelDelegate, 
  3.   TTURLRequestDelegate 
  4. > { 

方法

一個(gè)方法的命名首先描述返回什么,接著是什么情況下被返回。方法簽名中冒號(hào)的前面描述傳入?yún)?shù)的類(lèi)型。以下類(lèi)方法和實(shí)例方法命名的格式語(yǔ)法:

  1. [object/class thing+condition]; 
  2. [object/class thing+input:input]; 
  3. [object/class thing+identifer:input]; 

Cocoa命名舉例:

  1. realPath    = [path     stringByExpandingTildeInPath]; 
  2. fullString  = [string   stringByAppendingString:@"Extra Text"]; 
  3. object      = [array    objectAtIndex:3]; 
  4. // 類(lèi)方法 
  5. newString   = [NSString stringWithFormat:@"%f",1.5]; 
  6. newArray    = [NSArray  arrayWithObject:newString]; 

良好的自定義方法命名風(fēng)格:

  1. recipients  = [email    recipientsSortedByLastName]; 
  2. newEmail    = [CDCEmail emailWithSubjectLine:@"Extra Text"]; 
  3. emails      = [mailbox  messagesReceivedAfterDate:yesterdayDate]; 

當(dāng)需要獲取對(duì)象值的另一種類(lèi)型的時(shí)候,方法命名的格式語(yǔ)法如下:

  1. [object adjective+thing]; 
  2. [object adjective+thing+condition]; 
  3. [object adjective+thing+input:input]; 

良好的自定義方法命名風(fēng)格:

  1. capitalized = [name    capitalizedString]; 
  2. rate        = [number  floatValue]; 
  3. newString   = [string  decomposedStringWithCanonicalMapping]; 
  4. subarray    = [array   subarrayWithRange:segment]; 

方法簽名盡量做到含義明確。

不良的風(fēng)格:

-sortInfo  // 是返回排序結(jié)果還是給info做排序

-refreshTimer  // 返回一個(gè)用于刷新的定時(shí)器還是刷新定時(shí)器

-update  // 更新什么,如何更新

良好的風(fēng)格:

-currentSortInfo      // "current" 清楚地修飾了名詞SortInfo

-refreshDefaultTimer  // refresh是一個(gè)動(dòng)詞。

-updateMenuItemTitle  // 一個(gè)正在發(fā)生的動(dòng)作

方法類(lèi)型修飾符+/-后要放置一個(gè)空格,各參數(shù)名之間也要放置一個(gè)空格。

良好的風(fēng)格:

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

如果方法的命名特別長(zhǎng),將方法名拆分成多行。

良好的風(fēng)格:

  1. color = [NSColor colorWithCalibratedHue: 0.10 
  2.                                saturation: 0.82 
  3.                               brightness: 0.89 
  4.                                     alpha: 1.00]; 

不要將私有的實(shí)例變量和方法聲明在頭文件中,應(yīng)將私有變量和方法聲明在實(shí)現(xiàn)文件的類(lèi)擴(kuò)展內(nèi)。

不良的風(fēng)格:

  1. //MyViewController.h文件 
  2. @interface MyViewController : UIViewController< 
  3.  UITalbeViewDataSource, 
  4.  UITableViewDelegate> { 
  5.  @private
  6.   UITableView *_myTableView;  // 私有實(shí)例變量 
  7. // 內(nèi)部使用的屬性 
  8. @property (nonatomic,strong) NSNumber *variableUsedInternally; 
  9. - (void)sortName;  // 只用于內(nèi)部使用的方法 
  10. @end 

良好的風(fēng)格:

  1. //MyViewController.m文件使用類(lèi)擴(kuò)展 
  2. @interface MyViewController()< 
  3.  UITalbeViewDataSource, 
  4.  UITableViewDelegate> { 
  5.   UITableView *_myTableView; 
  6. // 外部需要訪(fǎng)問(wèn)的實(shí)例變量聲明為屬性,不需要外部訪(fǎng)問(wèn)的聲明為實(shí)例變量 
  7.   NSNumber * variableUsedInternally; 
  8. // 從Xcode4.3開(kāi)始,可以不寫(xiě)方法的前置聲明,Interface Builder和Storyboard仍然可以找到方法的定義 
  9. @end 

構(gòu)造函數(shù)通常應(yīng)該返回實(shí)例類(lèi)型而不是id類(lèi)型

下頁(yè)內(nèi)容更精彩

#p#

參數(shù)

方法參數(shù)名前一般使用的前綴包括“the”、“an”、“new”。

良好的風(fēng)格:

  1. - (void)       setTitle:           (NSString *)   aTitle; 
  2. - (void)       setName:            (NSString *)   newName; 
  3. - (id)         keyForOption:       (CDCOption *)  anOption 
  4. - (NSArray *)  emailsForMailbox:   (CDCMailbox *) theMailbox; 
  5. - (CDCEmail *) emailForRecipients: (NSArray *)    theRecipients; 

變量

變量的命令應(yīng)盡量做到自描述。除了在for()循環(huán)語(yǔ)句中,單字母的變量應(yīng)該避免使用(如i,j,k等)。一般循環(huán)語(yǔ)句的當(dāng)前對(duì)象的命名前綴包括“one”、“a/an”。對(duì)于簡(jiǎn)單的單個(gè)對(duì)象使用“item”命名。

良好的風(fēng)格:

  1. for (i = 0; i < count; i++) { 
  2.     oneObject = [allObjects objectAtIndex: i]; 
  3.     NSLog (@"oneObject: %@", oneObject); 
  4. NSEnumerator *e = [allObjects objectEnumerator]; 
  5. id item; 
  6. while (item = [e nextObject]) 
  7.       NSLog (@"item: %@", item); 

指針變量的星號(hào)指示符應(yīng)該緊靠變量,比如NSString *text,而不是NSString* text或NSString * text。

盡量的使用屬性而非實(shí)例變量。除了在初始化方法(init,initWithCoder:等)、dealloc方法以及自定義setter與getter方法中訪(fǎng)問(wèn)屬性合成的實(shí)例變量,其他的情況使用屬性進(jìn)行訪(fǎng)問(wèn)。

良好的風(fēng)格:

  1. @interface RNCSection: NSObject 
  2. @property (nonatomic) NSString *headline; 
  3. @end 

不良的風(fēng)格:

  1. @interface RNCSection : NSObject { 
  2.     NSString *headline; 

當(dāng)你使用@synthesize指令時(shí),編譯器會(huì)自動(dòng)為你創(chuàng)建一個(gè)下劃線(xiàn)_開(kāi)頭的的實(shí)例變量,所以不需要同時(shí)聲明實(shí)例變量和屬性。

不良的風(fēng)格:

  1. @interface RNCSection : NSObject { 
  2.     NSString *headline; 
  3. @property (nonatomic) NSString *headline; 
  4. @end 

良好的風(fēng)格:

  1. @interface RNCSection: NSObject 
  2. @property (nonatomic) NSString *headline; 
  3. @end 

不要使用@synthesize除非是編譯器需要。注意在@protoco協(xié)議中的@optional可選屬性必須被顯式地使用@synthesize指令合成屬性。

縮略詞

雖然方法命名不應(yīng)使用縮略詞,然而有些縮略詞在過(guò)去被反復(fù)的使用,所以使用這些縮略詞能更好的的表達(dá)代碼的含義。下表列出了Cocoa可接受的縮略詞。

........................................................

以下是一些常用的首字母縮略詞

ASCII

PDF

XML

HTML

URL

RTF

HTTP

TIFF

JPG

PNG

GIF

LZW

ROM

RGB

CMYK

MIDI

FTP

命名

方法和變量的命令應(yīng)該盡可能做到自描述。

良好的風(fēng)格:

  1. UIButton *settingsButton; 

不良的風(fēng)格:

  1. UIButton *setBut; 

對(duì)于NSString、NSArray、NSNumber或BOOL類(lèi)型,變量的命名一般不需要表明其類(lèi)型。

良好的風(fēng)格:

  1. NSString       *accountName; 
  2. NSMutableArray *mailboxes; 
  3. NSArray        *defaultHeaders; 
  4. BOOL             userInputWasUpdated; 

不良的風(fēng)格:

  1. NSString        *accountNameString; 
  2. NSMutableArray *mailboxArray; 
  3. NSArray        *defaultHeadersArray; 
  4. BOOL             userInputWasUpdatedBOOL; 

如果變量不是以上基本常用類(lèi)型,則變量的命名就應(yīng)該反映出自身的類(lèi)型。但有時(shí)僅需要某些類(lèi)的一個(gè)實(shí)例的情況下,那么只需要基于類(lèi)名進(jìn)行命名。

  1. NSImage               *previewPaneImage;  
  2. NSProgressIndicator  *uploadIndicator;  
  3. NSFontManager        *fontManager;       // 基于類(lèi)名命名 

大部分情況下,NSArray或NSSet類(lèi)型的變量只需要使用單詞復(fù)數(shù)形式(比如mailboxes),不必在命名中包含“mutable”。如果復(fù)數(shù)變量不是NSArray或NSSet類(lèi)型,則需要指定其類(lèi)型。

良好的風(fēng)格:

  1. NSDictionary * keyedAccountNames; 
  2. NSDictionary * messageDictionary; 
  3. NSIndexSet   * selectedMailboxesIndexSet; 

由于Objective-C不支持名字空間,為了防止出現(xiàn)命名空間的沖突,在類(lèi)名和常類(lèi)型變量名前添加一個(gè)由三個(gè)大寫(xiě)的字母組成的前綴(如 RNC),對(duì)于Core Data實(shí)體名則可以忽略此規(guī)則。如果你子類(lèi)化了標(biāo)準(zhǔn)的Cocoa類(lèi),將前綴和父類(lèi)名合并是一個(gè)很好的做法。如繼承UITableView的類(lèi)可命名為 RNCTableView。

常類(lèi)型變量名的書(shū)寫(xiě)風(fēng)格采用駝峰式大小寫(xiě)(第一個(gè)單詞的首字母小寫(xiě),其余單詞的第一個(gè)字母大寫(xiě)。如firstName而不是first_name或firstname。),并使用關(guān)聯(lián)的類(lèi)名作為其命名前綴,

推薦的做法:

  1. static const NSTimeInterval RNCArticleViewControllerNavigationFadeAnimationDuration = 0.3; 

不推薦的做法:

  1. static const NSTimeInterval fadetime = 1.7; 

下頁(yè)內(nèi)容更精彩

#p#

下劃線(xiàn)

使用屬性的時(shí)候,實(shí)例變量應(yīng)該使用self.進(jìn)行訪(fǎng)問(wèn)和設(shè)值。局部變量的命令不要包含下劃線(xiàn)。實(shí)例變量的命名必須使用下劃線(xiàn)_作為前綴,這樣可以縮小Xcode自動(dòng)完成的選項(xiàng)取值范圍。

注釋

在需要的時(shí)候,注釋可對(duì)代碼做必要的解釋。更新代碼時(shí)一定要更新注釋?zhuān)乐箤?duì)代碼造成誤解。

使用javadoc風(fēng)格的文檔注釋語(yǔ)法。注釋的第一行是對(duì)注釋API的總結(jié),隨后的注釋行是對(duì)代碼更多細(xì)節(jié)的解釋。

良好的風(fēng)格:

  1. /** 
  2.  * The maximum size of a download that is allowed. 
  3.  * 
  4.  * If a response reports a content length greater than the max * will be cancelled. This is helpful for preventing excessive memory usage. 
  5.  * Setting this to zero will allow all downloads regardless of size. 
  6.  * 
  7.  * @default 150000 bytes 
  8.  */ 
  9. @property (nonatomic) NSUInteger maxContentLength; 

init與dealloc

dealloc方法應(yīng)該被放置在實(shí)現(xiàn)方法的頂部,直接在@synthesize或@dynamic語(yǔ)句之后。init方法應(yīng)該被放置在dealloc方法的下面。

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

  1. - (instancetype)init { 
  2.     self = [super init]; // or call the designated initalizer 
  3.     if (self) { 
  4.         // Custom initialization 
  5.     } 
  6.     return self; 

字面值

對(duì)于NSString,NSDictionary,NSArray和NSNumber類(lèi),當(dāng)需要?jiǎng)?chuàng)建這些類(lèi)的不可變實(shí)例時(shí),應(yīng)該使用這些類(lèi)的字 面值表示形式。使用字面值表示的時(shí)候nil不需要傳入NSArray和NSDictionary中作為字面值。這種語(yǔ)法兼容老的iOS版本,因此可以在 iOS5或者更老的版本中使用它。

良好的風(fēng)格:

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

不良的風(fēng)格:

  1. NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil]; 
  2. NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil]; 
  3. NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES]; 
  4. NSNumber *buildingZIPCode = [NSNumber numberWithInteger:10018]; 

如非必要,避免使用特定類(lèi)型的數(shù)字(相較于使用5.3f,應(yīng)使用5.3)。

CGRect函數(shù)

相較于使用結(jié)構(gòu)體輔助函數(shù)(如CGRectMake()函數(shù)),優(yōu)先使用C99結(jié)構(gòu)體初始化語(yǔ)法。

  1. CGRect rect = {.origin.x = 3.0, .origin.y = 12.0, .size.width = 15.0, .size.height = 80.0 }; 

當(dāng)訪(fǎng)問(wèn)CGRect結(jié)構(gòu)體的x、y、width、height成員時(shí),應(yīng)使用CGGeometry函數(shù),不直接訪(fǎng)問(wèn)結(jié)構(gòu)體成員。蘋(píng)果對(duì)CGGeometry函數(shù)的介紹:

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.

良好的風(fēng)格:

  1. CGRect frame = self.view.frame; 
  2. CGFloat x = CGRectGetMinX(frame); 
  3. CGFloat y = CGRectGetMinY(frame); 
  4. CGFloat width = CGRectGetWidth(frame); 
  5. CGFloat height = CGRectGetHeight(frame); 

不良的風(fēng)格:

  1. CGRect frame = self.view.frame; 
  2. CGFloat x = frame.origin.x; 
  3. CGFloat y = frame.origin.y; 
  4. CGFloat width = frame.size.width; 
  5. CGFloat height = frame.size.height; 

常量

 優(yōu)先使用常類(lèi)型變量,而不是內(nèi)嵌的字符串字面值或數(shù)字,因?yàn)槌n?lèi)型變量能很容易的復(fù)用常用的變量值(如π),同時(shí)可以快速地修改值而無(wú)需查找替換。常類(lèi)型變量應(yīng)該聲明為static類(lèi)型,不要使用#define,除非常類(lèi)型變量被作為宏使用。

良好的風(fēng)格:

  1. static NSString * const RNCAboutViewControllerCompanyName = @"The New York Times Company"
  2. static const CGFloat RNCImageThumbnailHeight = 50.0; 

不良的風(fēng)格:

  1. #define CompanyName @"The New York Times Company" 
  2. #define thumbnailHeight 2 

枚舉類(lèi)型

當(dāng)使用enum關(guān)鍵字時(shí),推薦使用蘋(píng)果最新引入的固定基礎(chǔ)類(lèi)型語(yǔ)法,因?yàn)檫@將獲得強(qiáng)類(lèi)型檢查與代碼完成功能。SDK現(xiàn)在包含了一個(gè)固定基礎(chǔ)類(lèi)型的宏——NS_ENUM()。

NS_ENUM是在iOS6中開(kāi)始引入的,為了支持之前的iOS版本,使用簡(jiǎn)單的內(nèi)聯(lián)方法:

  1. #ifndef NS_ENUM 
  2. #define NS_ENUM(_type, _name) enum _name : _type _name; enum _name : _type 
  3. #endif 

良好的風(fēng)格:

  1. typedef NS_ENUM(NSInteger, RNCAdRequestState) { 
  2.     RNCAdRequestStateInactive, 
  3.     RNCAdRequestStateLoading 
  4. }; 

私有屬性

私有屬性應(yīng)該被聲明在實(shí)現(xiàn)文件的類(lèi)擴(kuò)展中(即匿名的category)。不要將私有屬性聲明在命名的category(如RNCPrivate或private),除非是擴(kuò)展其他類(lèi)。

良好的風(fēng)格:

  1. @interface NYTAdvertisement () 
  2. @property (nonatomic, strong) GADBannerView *googleAdView; 
  3. @property (nonatomic, strong) ADBannerView *iAdView; 
  4. @property (nonatomic, strong) UIWebView *adXWebView; 
  5. @end 

圖片的命名

圖片的命名應(yīng)該保持一致,以圖片的用途描述作為圖片文件名。文件名的命名使用駝峰式大小寫(xiě)風(fēng)格,文件名后可跟隨一個(gè)自定義的類(lèi)名或者是自定義的屬性名(如果有屬性名)、也可以再跟上顏色描述以及/或者位置、圖片的最終狀態(tài)。

良好的風(fēng)格:

  1. RefreshBarButtonItem / RefreshBarButtonItem@2x 和 RefreshBarButtonItemSelected / RefreshBarButtonItemSelected@2x 
  2. ArticleNavigationBarWhite / ArticleNavigationBarWhite@2x 和 ArticleNavigationBarBlackSelected / ArticleNavigationBarBlackSelected@2x. 

被用作相似用途的圖片應(yīng)該使用一個(gè)圖片文件夾進(jìn)行分開(kāi)管理。

布爾類(lèi)型

因?yàn)閚il被解析為了NO,所以和nil作比較沒(méi)有任何的必要。不要將變量和YES直接比較,因?yàn)閅ES被定義為1而B(niǎo)OOL類(lèi)型是8位的unsigned int,即BOOL的值不僅僅是1或0。

良好的風(fēng)格:

  1. if (!someObject) { 
  2.  

不良的風(fēng)格:

  1. if (someObject == nil) { 
  2.  

對(duì)于一個(gè)BOOL值:兩種最佳實(shí)踐:

if (isAwesome)

if (![someObject boolValue])

不良的風(fēng)格:

  1. if ([someObject boolValue] == NO) 
  2. if (isAwesome == YES) // Never do this. 

如果一個(gè)BOOL類(lèi)型的屬性名是一個(gè)形容詞,忽略屬性名的“is”前綴是允許的,但需要為訪(fǎng)問(wèn)器指定約定的方法名,比如:

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

單例

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

  1. + (instancetype)sharedInstance { 
  2.    static id sharedInstance = nil; 
  3.    static dispatch_once_t onceToken; 
  4.    dispatch_once(&onceToken, ^{ 
  5.       sharedInstance = [[self alloc] init]; 
  6.    }); 
  7.    return sharedInstance; 

附錄

Xcode主題

大部分的開(kāi)發(fā)者都使用Xcode默認(rèn)的字體顏色主題,其實(shí)好的主題不僅能提高源代碼的辨識(shí)度,同時(shí)也增添了編碼的樂(lè)趣。以下是二款Xcode字體顏色主題鏈接:

https://github.com/vinhnx/Ciapre-Xcode-theme

https://github.com/tursunovic/xcode-themes

代碼片段

熟練使用代碼片段庫(kù)可以提高編碼的速度。Xcode4中,打開(kāi)一個(gè)項(xiàng)目并讓右側(cè)編輯區(qū)可視,然后點(diǎn)擊右側(cè)底部面板的第四個(gè){}圖標(biāo),打開(kāi)代碼片段庫(kù),你可以將常用的代碼拖入其中。以下是一個(gè)最新的開(kāi)源代碼片段庫(kù)鏈接:

https://github.com/mattt/Xcode-Snippets

參考文獻(xiàn)

[1] 《NYTimes Objective-C Style Guide》 https://github.com/NYTimes/objective-c-style-guide

[2] 《Coding Guidelines for Cocoa》https://developer.apple.com/library/mac/documentation/Cocoa /Conceptual/CodingGuidelines/Articles/APIAbbreviations.html

[3] 《iOS-view-frame-builder》https://github.com/rsobik/ios-view-frame-builder/commit/0fa2d81762bc21619b1503d34b7d67160f4678f8

[4] 《Cocoa Style for Objective-C: Part I》 http://cocoadevcentral.com/articles/000082.php

[5] 《Cocoa Style for Objective-C: Part II》http://cocoadevcentral.com/articles/000083.php

[6] 《objective-c-conventionsI》https://github.com/github/objective-c-conventions

責(zé)任編輯:閆佳明 來(lái)源: cocoachina
相關(guān)推薦

2015-07-13 10:48:44

OC代碼程序員

2010-03-01 14:31:04

Java

2011-03-04 10:11:09

JavascriptAPI

2023-07-06 14:51:30

開(kāi)發(fā)高質(zhì)量軟件

2011-07-28 15:11:23

iOS Objective-

2011-07-28 18:11:18

Objective-C Cocoa 編程

2014-09-26 09:49:48

SwiftObjective-C

2015-08-25 08:29:11

編寫(xiě)高質(zhì)量命名

2011-12-29 15:02:27

JavaScript

2015-08-25 08:42:36

高質(zhì)量代碼命名

2014-04-01 10:50:42

iOS開(kāi)發(fā)runtimeObjective-C

2017-07-14 09:54:47

代碼函數(shù)程序

2012-09-13 10:44:18

Python代碼

2011-04-08 10:51:17

Objective-CiOS

2023-10-31 16:22:31

代碼質(zhì)量軟件開(kāi)發(fā)Java

2011-07-21 10:10:42

Objective-C 內(nèi)存 Autoreleas

2011-05-11 14:06:49

Objective-C

2024-03-07 11:39:24

HadolintDockerfile工具

2011-07-29 16:16:30

Objective-c block

2011-04-01 09:13:19

VB程序員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本精品二区| 日本欧美一二三区| 精品人妻二区中文字幕| 大黄网站在线观看| 久久综合久久综合久久综合| 国产精品高潮粉嫩av| 日韩高清dvd碟片| 巨人精品**| 欧美日韩高清不卡| 青青青免费在线| 自拍视频在线播放| 成人高清在线视频| 国产精品一区二区久久精品| 国产小视频在线观看免费| 精品国产一区二区三区噜噜噜 | 精品国产一区久久久| 巨乳女教师的诱惑| 东京一区二区| 亚洲在线视频一区| 亚洲无玛一区| 色在线免费视频| 国产精品中文字幕一区二区三区| 欧美在线免费看| 男女羞羞免费视频| 日本激情一区| 亚洲精品自产拍| www.四虎精品| 成人乱码手机视频| 在线视频综合导航| 免费毛片小视频| 欧美黑人猛交的在线视频| 国产精品久久综合| 蜜桃网站成人| 视频二区在线观看| 国产乱子轮精品视频| 国产女精品视频网站免费| 亚洲男人的天堂在线视频| 你懂的网址国产 欧美| 日韩亚洲在线观看| 日韩免费成人av| 自拍自偷一区二区三区| 亚洲第一av在线| 26uuu国产| 精品视频一区二区三区| 欧美日韩国产另类一区| 九九热免费精品视频| 亚洲深夜视频| 欧美性xxxx极品hd满灌| 日本高清视频免费在线观看| 日本高清视频在线观看| 国产精品视频yy9299一区| 日韩高清国产一区在线观看| 户外极限露出调教在线视频| 久久一区二区三区四区| 蜜桃视频在线观看91| 日本a一级在线免费播放| 不卡的看片网站| 国产乱码精品一区二区三区不卡| 国产ts变态重口人妖hd| 国产福利精品一区| 91成人免费观看| www日本视频| 国产91精品入口| 国产高清在线一区二区| 亚洲乱码国产乱码精品精软件| 国产99一区视频免费| 国产精成人品localhost| 亚洲精品一区二区三区四区| 不卡影院免费观看| 鲁鲁狠狠狠7777一区二区| 视频二区在线| 国产免费成人在线视频| 亚洲综合网中心| jizz性欧美| 亚洲一区二区中文在线| 日韩在线综合网| 日韩三区免费| 欧美日韩国产影片| 老司机av网站| 欧美电影在线观看免费| 一区二区三区视频在线| 中文字幕无码日韩专区免费| 欧美精品国产| 国产91精品不卡视频| 久久精品99北条麻妃| 久久99日本精品| 成人性色av| 青青草免费观看免费视频在线| 国产女人18水真多18精品一级做| 中文字幕99| 欧美aaaaaaa| 日韩欧美在线免费| 亚洲天堂伊人网| 大伊香蕉精品在线品播放| 亚洲色图在线观看| 国产女人18水真多毛片18精品| 99综合在线| 国产主播欧美精品| 五月天婷婷视频| 国产精品久久久久婷婷二区次| 久草视频这里只有精品| 欧美日韩精品免费观看视完整| 在线播放欧美女士性生活| 成人在线电影网站| 欧美一级淫片| 68精品久久久久久欧美| 91麻豆成人精品国产| 不卡一区二区中文字幕| 国产日本欧美在线| 成人影院大全| 精品av久久707| 亚洲一二三精品| 韩国精品一区二区三区| 国产精品一区久久久| 色综合888| 亚洲图片自拍偷拍| 在线观看免费av网址| 亚洲成在人线免费观看| 欧美另类在线观看| 久草热在线观看| 99久久国产综合精品女不卡| 91成人在线视频观看| 天天综合网站| 亚洲黄色av网站| 加勒比婷婷色综合久久| 日韩不卡一二三区| 久久伊人一区二区| 超级碰碰不卡在线视频| 制服丝袜中文字幕一区| 超碰人人人人人人人| 翔田千里一区二区| 好看的日韩精品| 中文av资源在线| 制服.丝袜.亚洲.中文.综合| 卡一卡二卡三在线观看| 另类亚洲自拍| 久久精品午夜一区二区福利| 成人av影院在线观看| 欧美一卡2卡三卡4卡5免费| 国产在线观看免费视频软件| 天堂av在线一区| 欧美视频小说| 综合在线影院| 有码中文亚洲精品| 波多野结衣视频网址| 2023国产一二三区日本精品2022| 老太脱裤子让老头玩xxxxx| 在线综合色站| 欧美—级a级欧美特级ar全黄| av官网在线观看| 亚洲人吸女人奶水| 4438x全国最大成人| 欧美+日本+国产+在线a∨观看| 亚洲一区二区三区久久| av文字幕在线观看| 日韩一卡二卡三卡四卡| 久久久精品人妻一区二区三区四| 国产久卡久卡久卡久卡视频精品| 强开小嫩苞一区二区三区网站| **精品中文字幕一区二区三区| www.欧美三级电影.com| 国产精品自偷自拍| 亚洲资源中文字幕| 先锋资源av在线| 久久99伊人| 午夜精品区一区二区三| 久久91视频| 欧美高清视频免费观看| 欧美 日韩 国产 在线| 欧美日韩亚洲网| b站大片免费直播| 美腿丝袜亚洲一区| 久久久久久久久久久久久国产| 91精品久久久久久综合五月天| 午夜精品久久久久久久久久久久久| 香蕉视频成人在线| 色哟哟一区二区| 韩国一级黄色录像| 成人午夜av电影| 国产成人精品无码播放| 国产精品福利在线观看播放| 91九色露脸| 亚洲精品mv| www.色综合| 神马久久久久久久久久| 欧美色倩网站大全免费| 国产一级视频在线观看| 久久久亚洲精品石原莉奈| 亚洲第一区第二区第三区| 亚洲成人资源| 五月天亚洲综合情| 国产成人在线中文字幕| 国产精品久久久久久久久粉嫩av | 99国产精品久久一区二区三区| 91国产视频在线| 69久久夜色| 欧美精品一区二区在线播放| 久久永久免费视频| 亚洲一区免费观看| 国产福利在线导航| 成人一道本在线| 性猛交ⅹ×××乱大交| 一本色道久久综合亚洲精品不| 五月天丁香综合久久国产| 99国产精品久久一区二区三区| 国产精品久久不能| 国产夫妻在线播放| 久热国产精品视频| 麻豆导航在线观看| 精品免费一区二区三区| 亚洲视频一区在线播放| 欧美日韩国产中文精品字幕自在自线| 国产中文av在线| 久久免费午夜影院| zjzjzjzjzj亚洲女人| 美女久久久精品| 激情综合在线观看| 国产精品红桃| 熟女视频一区二区三区| 欧美人妖在线| 精品欧美日韩在线| 亚洲国产精品免费视频| 国产在线观看不卡| 99亚洲伊人久久精品影院| 91高清视频在线免费观看| 色呦呦在线观看视频| 综合国产在线观看| 国际av在线| 亚洲跨种族黑人xxx| 六月婷婷综合网| 日韩视频在线永久播放| 一级黄色免费片| 欧美日韩一区 二区 三区 久久精品| 免费观看一区二区三区毛片| 亚洲无人区一区| 国产一级淫片a| 亚洲午夜在线观看视频在线| www.99re7| 亚洲人成精品久久久久久| 青青青视频在线免费观看| 国产偷国产偷精品高清尤物| 三上悠亚ssⅰn939无码播放| av不卡在线播放| 给我免费观看片在线电影的| 成人三级在线视频| 丝袜熟女一区二区三区| 国产成人精品免费在线| 秘密基地免费观看完整版中文| 国产精品18久久久久久vr | aaa亚洲精品| 人妻av一区二区| 成年人午夜久久久| 亚洲调教欧美在线| 99re66热这里只有精品3直播| 中文字幕一区二区三区乱码不卡| 99国产精品久久久| 一女三黑人理论片在线| 91碰在线视频| 久久美女免费视频| 中文字幕精品一区二区三区精品 | 天堂av中文字幕| 日韩精品中文字幕在线播放| 免费黄色在线视频网站| 伊人久久久久久久久久久| 美女羞羞视频在线观看| 欧美成人免费在线视频| 欧美78videosex性欧美| 国产91精品久| 国产乱子精品一区二区在线观看| 成人免费xxxxx在线观看| 免费看一区二区三区| 粉嫩高清一区二区三区精品视频| 果冻天美麻豆一区二区国产| 女人一区二区三区| 日韩欧美中字| 黄色三级中文字幕| 亚洲一区成人| 污污网站免费看| 国产suv精品一区二区三区| 黄色片视频免费观看| 久久久91精品国产一区二区三区| 操她视频在线观看| 一区二区在线看| 日韩免费视频一区二区视频在线观看| 欧美性猛交xxxx乱大交极品| 最近中文字幕免费在线观看| 日韩三级在线免费观看| 四虎在线免费观看| 啊v视频在线一区二区三区| 黄色成人在线网| 国产精品美女久久久免费| 日韩第一区第二区| 日韩欧美在线电影| 伊人天天综合| 国产成人在线综合| 99re热视频这里只精品| 精品一区二区在线观看视频| 亚洲 欧美综合在线网络| 中文字幕欧美人妻精品| 亚洲成人激情图| 男人的天堂在线视频免费观看| 国内精品免费午夜毛片| 天堂综合在线播放| 精品欧美一区二区久久久伦| 永久91嫩草亚洲精品人人| 日本久久久精品视频| 国产风韵犹存在线视精品| 国产综合精品在线| 亚洲va国产天堂va久久en| 最近中文字幕免费观看| 日韩国产精品视频| 色呦呦久久久| 91探花福利精品国产自产在线| 美女少妇全过程你懂的久久| 中文字幕一区二区三区在线乱码| 国产视频一区在线观看一区免费| 精品国产午夜福利在线观看| 国产亚洲制服色| 日本中文字幕在线| 精品国产91亚洲一区二区三区婷婷| 免费人成在线观看播放视频| 欧美最猛性xxxxx亚洲精品| 成人av动漫| 男人日女人的bb| 精油按摩中文字幕久久| 成人激情五月天| 欧美性xxxx在线播放| 午夜国产在线观看| 欧美黄色片免费观看| 国产精品日本一区二区三区在线| 四虎影院一区二区三区| 亚洲一区二区毛片| www.色多多| 欧美视频一二三| 天堂中文在线视频| 欧美精品第一页在线播放| 精品国模一区二区三区欧美| 成年人免费观看的视频| 蜜臀av一区二区| 懂色av蜜臀av粉嫩av永久| 在线观看日韩一区| 国产三区四区在线观看| 国产91成人在在线播放| 亚洲bt欧美bt精品777| 欧美一区二区中文字幕| 成人91在线观看| 日韩毛片一区二区三区| 日韩欧美一二三区| 久久大胆人体| 国产精品一区二区欧美| 亚洲黄色影院| 久久无码人妻精品一区二区三区| 午夜精品在线视频一区| 天天插天天干天天操| 2021国产精品视频| 亚洲宅男网av| 杨幂毛片午夜性生毛片| 国产精品毛片大码女人| 一级特黄aa大片| 欧美成人免费一级人片100| 欧美久久一区二区三区| 男人天堂a在线| 91看片淫黄大片一级在线观看| 91精品国产高清一区二区三密臀| 亚洲欧美精品中文字幕在线| 性欧美超级视频| 一区二区在线不卡| 国产精品一区二区在线观看不卡 | 美日韩精品免费| 久久久久久久尹人综合网亚洲| 久久久久久国产免费a片| 欧美男男青年gay1069videost| 91在线中文| 精品视频免费观看| 日本不卡中文字幕| √天堂中文官网8在线| 欧美大片免费久久精品三p| 黄频免费在线观看| 亚洲a∨一区二区三区| 国产高清不卡一区| 国产无套丰满白嫩对白| www.日韩av.com| 久久97精品| 日本不卡一区二区在线观看| 伊人色综合久久天天| 国外av在线| 国产高清精品一区| 青青青伊人色综合久久| 久草免费在线观看视频| 亚洲午夜av久久乱码| 免费看日产一区二区三区| av免费播放网址| 亚洲免费观看视频| 经典三级在线| 福利视频久久| 久久精品99国产精品| 日韩精品――中文字幕| 日韩中文综合网| 亚洲va久久| 日本50路肥熟bbw|