zoukankan      html  css  js  c++  java
  • 代码书写规范

       1 # 译者的话
       2 
       3  
       4 
       5 代码风格的重要性对于一个团队和项目来说不言而喻。网上有许多 Objective-C 的代码风格,但这份简洁而又最符合苹果的规范,同时有助于养成良好的代码习惯,也是我们团队一直遵循的代码风格。
       6 
       7  
       8 
       9 原文在[这里][original_link]。
      10 
      11 本人才疏学浅,如果有任何翻译不当欢迎在 [Issues][Issues_link] 中反馈或者直接 [Fork][Fork_link] 。
      12 
      13  
      14 
      15 [original_link]:https://github.com/NYTimes/objective-c-style-guide
      16 
      17  
      18 
      19 [Issues_link]:https://github.com/VincentSit/NYTimes-Objective-C-Style-Guide-ZH/issues
      20 
      21  
      22 
      23 [Fork_link]:https://github.com/NYTimes/objective-c-style-guide/fork
      24 
      25  
      26 
      27 ----
      28 
      29  
      30 
      31 # 纽约时报 移动团队 Objective-C 规范指南
      32 
      33  
      34 
      35 这份规范指南概括了纽约时报 iOS 团队的代码约定。
      36 
      37  
      38 
      39 ## 介绍
      40 
      41  
      42 
      43 关于这个编程语言的所有规范,如果这里没有写到,那就在苹果的文档里: 
      44 
      45  
      46 
      47 * [Objective-C 编程语言][Introduction_1]
      48 
      49 * [Cocoa 基本原理指南][Introduction_2]
      50 
      51 * [Cocoa 编码指南][Introduction_3]
      52 
      53 * [iOS 应用编程指南][Introduction_4]
      54 
      55  
      56 
      57 [Introduction_1]:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html
      58 
      59  
      60 
      61 [Introduction_2]:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/Introduction/Introduction.html
      62 
      63  
      64 
      65 [Introduction_3]:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html
      66 
      67  
      68 
      69 [Introduction_4]:http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/Introduction/Introduction.html
      70 
      71  
      72 
      73  
      74 
      75 ## 目录
      76 
      77  
      78 
      79 * [点语法](#点语法)
      80 
      81 * [间距](#间距)
      82 
      83 * [条件判断](#条件判断)
      84 
      85 * [三目运算符](#三目运算符)
      86 
      87 * [错误处理](#错误处理)
      88 
      89 * [方法](#方法)
      90 
      91 * [变量](#变量)
      92 
      93 * [命名](#命名)
      94 
      95 * [注释](#注释)
      96 
      97 * [Init 和 Dealloc](#init-和-dealloc)
      98 
      99 * [字面量](#字面量)
     100 
     101 * [CGRect 函数](#CGRect-函数)
     102 
     103 * [常量](#常量)
     104 
     105 * [枚举类型](#枚举类型)
     106 
     107 * [位掩码](#位掩码)
     108 
     109 * [私有属性](#私有属性)
     110 
     111 * [图片命名](#图片命名)
     112 
     113 * [布尔](#布尔)
     114 
     115 * [单例](#单例)
     116 
     117 * [导入](#导入)
     118 
     119 * [Xcode 工程](#Xcode-工程)
     120 
     121  
     122 
     123 ## 点语法
     124 
     125  
     126 
     127 应该 **始终** 使用点语法来访问或者修改属性,访问其他实例时首选括号。
     128 
     129  
     130 
     131 **推荐:**
     132 
     133 ```objc
     134 
     135 view.backgroundColor = [UIColor orangeColor];
     136 
     137 [UIApplication sharedApplication].delegate;
     138 
     139 ```
     140 
     141  
     142 
     143 **反对:**
     144 
     145 ```objc
     146 
     147 [view setBackgroundColor:[UIColor orangeColor]];
     148 
     149 UIApplication.sharedApplication.delegate;
     150 
     151 ```
     152 
     153  
     154 
     155 ## 间距
     156 
     157  
     158 
     159 * 一个缩进使用 4 个空格,永远不要使用制表符(tab)缩进。请确保在 Xcode 中设置了此偏好。
     160 
     161 * 方法的大括号和其他的大括号(`if`/`else`/`switch`/`while` 等等)始终和声明在同一行开始,在新的一行结束。
     162 
     163  
     164 
     165 **推荐:**
     166 
     167 ```objc
     168 
     169 if (user.isHappy) {
     170 
     171 // Do something
     172 
     173 }
     174 
     175 else {
     176 
     177 // Do something else
     178 
     179 }
     180 
     181 ```
     182 
     183 * 方法之间应该正好空一行,这有助于视觉清晰度和代码组织性。在方法中的功能块之间应该使用空白分开,但往往可能应该创建一个新的方法。
     184 
     185 * `@synthesize` 和 `@dynamic` 在实现中每个都应该占一个新行。
     186 
     187  
     188 
     189  
     190 
     191 ## 条件判断
     192 
     193  
     194 
     195 条件判断主体部分应该始终使用大括号括住来防止[出错][Condiationals_1],即使它可以不用大括号(例如它只需要一行)。这些错误包括添加第二行(代码)并希望它是 if 语句的一部分时。还有另外一种[更危险的][Condiationals_2],当 if 语句里面的一行被注释掉,下一行就会在不经意间成为了这个 if 语句的一部分。此外,这种风格也更符合所有其他的条件判断,因此也更容易检查。
     196 
     197  
     198 
     199 **推荐:**
     200 
     201 ```objc
     202 
     203 if (!error) {
     204 
     205     return success;
     206 
     207 }
     208 
     209 ```
     210 
     211  
     212 
     213 **反对:**
     214 
     215 ```objc
     216 
     217 if (!error)
     218 
     219     return success;
     220 
     221 ```
     222 
     223  
     224 
     225  226 
     227  
     228 
     229 ```objc
     230 
     231 if (!error) return success;
     232 
     233 ```
     234 
     235  
     236 
     237  
     238 
     239 [Condiationals_1]:(https://github.com/NYTimes/objective-c-style-guide/issues/26#issuecomment-22074256)
     240 
     241 [Condiationals_2]:http://programmers.stackexchange.com/a/16530
     242 
     243  
     244 
     245 ### 三目运算符
     246 
     247  
     248 
     249 三目运算符,? ,只有当它可以增加代码清晰度或整洁时才使用。单一的条件都应该优先考虑使用。多条件时通常使用 if 语句会更易懂,或者重构为实例变量。
     250 
     251  
     252 
     253 **推荐:**
     254 
     255 ```objc
     256 
     257 result = a > b ? x : y;
     258 
     259 ```
     260 
     261  
     262 
     263 **反对:**
     264 
     265 ```objc
     266 
     267 result = a > b ? x = c > d ? c : d : y;
     268 
     269 ```
     270 
     271  
     272 
     273 ## 错误处理
     274 
     275  
     276 
     277 当引用一个返回错误参数(error parameter)的方法时,应该针对返回值,而非错误变量。
     278 
     279  
     280 
     281 **推荐:**
     282 
     283 ```objc
     284 
     285 NSError *error;
     286 
     287 if (![self trySomethingWithError:&error]) {
     288 
     289     // 处理错误
     290 
     291 }
     292 
     293 ```
     294 
     295  
     296 
     297 **反对:**
     298 
     299 ```objc
     300 
     301 NSError *error;
     302 
     303 [self trySomethingWithError:&error];
     304 
     305 if (error) {
     306 
     307     // 处理错误
     308 
     309 }
     310 
     311 ```
     312 
     313 一些苹果的 API 在成功的情况下会写一些垃圾值给错误参数(如果非空),所以针对错误变量可能会造成虚假结果(以及接下来的崩溃)。
     314 
     315  
     316 
     317 ## 方法
     318 
     319  
     320 
     321 在方法签名中,在 -/+ 符号后应该有一个空格。方法片段之间也应该有一个空格。
     322 
     323  
     324 
     325 **推荐:**
     326 
     327 ```objc
     328 
     329 - (void)setExampleText:(NSString *)text image:(UIImage *)image;
     330 
     331 ```
     332 
     333  
     334 
     335 ## 变量
     336 
     337  
     338 
     339 变量名应该尽可能命名为描述性的。除了 `for()` 循环外,其他情况都应该避免使用单字母的变量名。
     340 
     341 星号表示指针属于变量,例如:`NSString *text` 不要写成 `NSString* text` 或者 `NSString * text` ,常量除外。
     342 
     343 尽量定义属性来代替直接使用实例变量。除了初始化方法(`init`, `initWithCoder:`,等), `dealloc` 方法和自定义的 setters 和 getters 内部,应避免直接访问实例变量。更多有关在初始化方法和 dealloc 方法中使用访问器方法的信息,参见[这里][Variables_1]。
     344 
     345  
     346 
     347  
     348 
     349 **推荐:**
     350 
     351  
     352 
     353 ```objc
     354 
     355 @interface NYTSection: NSObject
     356 
     357  
     358 
     359 @property (nonatomic) NSString *headline;
     360 
     361  
     362 
     363 @end
     364 
     365 ```
     366 
     367  
     368 
     369 **反对:**
     370 
     371  
     372 
     373 ```objc
     374 
     375 @interface NYTSection : NSObject {
     376 
     377     NSString *headline;
     378 
     379 }
     380 
     381 ```
     382 
     383  
     384 
     385 [Variables_1]:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447-SW6
     386 
     387  
     388 
     389 #### 变量限定符
     390 
     391  
     392 
     393 当涉及到[在 ARC 中被引入][Variable_Qualifiers_1]变量限定符时,
     394 
     395 限定符 (`__strong`, `__weak`, `__unsafe_unretained`, `__autoreleasing`) 应该位于星号和变量名之间,如:`NSString * __weak text`。
     396 
     397  
     398 
     399 [Variable_Qualifiers_1]:(https://developer.apple.com/library/ios/releasenotes/objectivec/rn-transitioningtoarc/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW4)
     400 
     401  
     402 
     403 ## 命名
     404 
     405  
     406 
     407 尽可能遵守苹果的命名约定,尤其那些涉及到[内存管理规则][Naming_1],([NARC][Naming_2])的。
     408 
     409  
     410 
     411 长的和描述性的方法名和变量名都不错。
     412 
     413  
     414 
     415 **推荐:**
     416 
     417  
     418 
     419 ```objc
     420 
     421 UIButton *settingsButton;
     422 
     423 ```
     424 
     425  
     426 
     427 **反对:**
     428 
     429  
     430 
     431 ```objc
     432 
     433 UIButton *setBut;
     434 
     435 ```
     436 
     437 类名和常量应该始终使用三个字母的前缀(例如 `NYT`),但 Core Data 实体名称可以省略。为了代码清晰,常量应该使用相关类的名字作为前缀并使用驼峰命名法。
     438 
     439  
     440 
     441 **推荐:**
     442 
     443  
     444 
     445 ```objc
     446 
     447 static const NSTimeInterval NYTArticleViewControllerNavigationFadeAnimationDuration = 0.3;
     448 
     449 ```
     450 
     451  
     452 
     453 **反对:**
     454 
     455  
     456 
     457 ```objc
     458 
     459 static const NSTimeInterval fadetime = 1.7;
     460 
     461 ```
     462 
     463  
     464 
     465 属性和局部变量应该使用驼峰命名法并且首字母小写。
     466 
     467  
     468 
     469 为了保持一致,实例变量应该使用驼峰命名法命名,并且首字母小写,以下划线为前缀。这与 LLVM 自动合成的实例变量相一致。
     470 
     471 **如果 LLVM 可以自动合成变量,那就让它自动合成。**
     472 
     473  
     474 
     475 **推荐:**
     476 
     477  
     478 
     479 ```objc
     480 
     481 @synthesize descriptiveVariableName = _descriptiveVariableName;
     482 
     483 ```
     484 
     485  
     486 
     487 **反对:**
     488 
     489  
     490 
     491 ```objc
     492 
     493 id varnm;
     494 
     495 ```
     496 
     497  
     498 
     499 [Naming_1]:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html
     500 
     501  
     502 
     503 [Naming_2]:http://stackoverflow.com/a/2865194/340508
     504 
     505  
     506 
     507 ## 注释
     508 
     509  
     510 
     511 当需要的时候,注释应该被用来解释 **为什么** 特定代码做了某些事情。所使用的任何注释必须保持最新否则就删除掉。
     512 
     513  
     514 
     515 通常应该避免一大块注释,代码就应该尽量作为自身的文档,只需要隔几行写几句说明。这并不适用于那些用来生成文档的注释。
     516 
     517  
     518 
     519  
     520 
     521 ## init 和 dealloc
     522 
     523  
     524 
     525 `dealloc` 方法应该放在实现文件的最上面,并且刚好在 `@synthesize` 和 `@dynamic` 语句的后面。在任何类中,`init` 都应该直接放在 `dealloc` 方法的下面。
     526 
     527  
     528 
     529 `init` 方法的结构应该像这样:
     530 
     531  
     532 
     533 ```objc
     534 
     535 - (instancetype)init {
     536 
     537     self = [super init]; // 或者调用指定的初始化方法
     538 
     539     if (self) {
     540 
     541         // Custom initialization
     542 
     543     }
     544 
     545  
     546 
     547     return self;
     548 
     549 }
     550 
     551 ```
     552 
     553  
     554 
     555 ## 字面量
     556 
     557  
     558 
     559 每当创建 `NSString`, `NSDictionary`, `NSArray`,和 `NSNumber` 类的不可变实例时,都应该使用字面量。要注意 `nil` 值不能传给 `NSArray` 和 `NSDictionary` 字面量,这样做会导致崩溃。
     560 
     561  
     562 
     563 **推荐:**
     564 
     565  
     566 
     567 ```objc
     568 
     569 NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
     570 
     571 NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal", @"Mobile Web" : @"Bill"};
     572 
     573 NSNumber *shouldUseLiterals = @YES;
     574 
     575 NSNumber *buildingZIPCode = @10018;
     576 
     577 ```
     578 
     579  
     580 
     581 **反对:**
     582 
     583  
     584 
     585 ```objc
     586 
     587 NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];
     588 
     589 NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil];
     590 
     591 NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];
     592 
     593 NSNumber *buildingZIPCode = [NSNumber numberWithInteger:10018];
     594 
     595 ```
     596 
     597  
     598 
     599 ## CGRect 函数
     600 
     601  
     602 
     603 当访问一个 `CGRect` 的 `x`, `y`, `width`, `height` 时,应该使用[`CGGeometry` 函数][CGRect-Functions_1]代替直接访问结构体成员。苹果的 `CGGeometry` 参考中说到:
     604 
     605  
     606 
     607 > 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.
     608 
     609  
     610 
     611 **推荐:**
     612 
     613  
     614 
     615 ```objc
     616 
     617 CGRect frame = self.view.frame;
     618 
     619  
     620 
     621 CGFloat x = CGRectGetMinX(frame);
     622 
     623 CGFloat y = CGRectGetMinY(frame);
     624 
     625 CGFloat width = CGRectGetWidth(frame);
     626 
     627 CGFloat height = CGRectGetHeight(frame);
     628 
     629 ```
     630 
     631  
     632 
     633 **反对:**
     634 
     635  
     636 
     637 ```objc
     638 
     639 CGRect frame = self.view.frame;
     640 
     641  
     642 
     643 CGFloat x = frame.origin.x;
     644 
     645 CGFloat y = frame.origin.y;
     646 
     647 CGFloat width = frame.size.width;
     648 
     649 CGFloat height = frame.size.height;
     650 
     651 ```
     652 
     653  
     654 
     655 [CGRect-Functions_1]:http://developer.apple.com/library/ios/#documentation/graphicsimaging/reference/CGGeometry/Reference/reference.html
     656 
     657  
     658 
     659 ## 常量
     660 
     661  
     662 
     663 常量首选内联字符串字面量或数字,因为常量可以轻易重用并且可以快速改变而不需要查找和替换。常量应该声明为 `static` 常量而不是 `#define` ,除非非常明确地要当做宏来使用。
     664 
     665  
     666 
     667 **推荐:**
     668 
     669  
     670 
     671 ```objc
     672 
     673 static NSString * const NYTAboutViewControllerCompanyName = @"The New York Times Company";
     674 
     675  
     676 
     677 static const CGFloat NYTImageThumbnailHeight = 50.0;
     678 
     679 ```
     680 
     681  
     682 
     683 **反对:**
     684 
     685  
     686 
     687 ```objc
     688 
     689 #define CompanyName @"The New York Times Company"
     690 
     691  
     692 
     693 #define thumbnailHeight 2
     694 
     695 ```
     696 
     697  
     698 
     699 ## 枚举类型
     700 
     701  
     702 
     703 当使用 `enum` 时,建议使用新的基础类型规范,因为它具有更强的类型检查和代码补全功能。现在 SDK 包含了一个宏来鼓励使用使用新的基础类型 - `NS_ENUM()`
     704 
     705  
     706 
     707 **推荐:**
     708 
     709  
     710 
     711 ```objc
     712 
     713 typedef NS_ENUM(NSInteger, NYTAdRequestState) {
     714 
     715     NYTAdRequestStateInactive,
     716 
     717     NYTAdRequestStateLoading
     718 
     719 };
     720 
     721 ```
     722 
     723  
     724 
     725 ## 位掩码
     726 
     727  
     728 
     729 当用到位掩码时,使用 `NS_OPTIONS` 宏。
     730 
     731  
     732 
     733 **举例:**
     734 
     735  
     736 
     737 ```objc
     738 
     739 typedef NS_OPTIONS(NSUInteger, NYTAdCategory) {
     740 
     741 NYTAdCategoryAutos      = 1 << 0,
     742 
     743 NYTAdCategoryJobs       = 1 << 1,
     744 
     745 NYTAdCategoryRealState  = 1 << 2,
     746 
     747 NYTAdCategoryTechnology = 1 << 3
     748 
     749 };
     750 
     751 ```
     752 
     753  
     754 
     755  
     756 
     757 ## 私有属性
     758 
     759  
     760 
     761 私有属性应该声明在类实现文件的延展(匿名的类目)中。有名字的类目(例如 `NYTPrivate` 或 `private`)永远都不应该使用,除非要扩展其他类。
     762 
     763  
     764 
     765 **推荐:**
     766 
     767  
     768 
     769 ```objc
     770 
     771 @interface NYTAdvertisement ()
     772 
     773  
     774 
     775 @property (nonatomic, strong) GADBannerView *googleAdView;
     776 
     777 @property (nonatomic, strong) ADBannerView *iAdView;
     778 
     779 @property (nonatomic, strong) UIWebView *adXWebView;
     780 
     781  
     782 
     783 @end
     784 
     785 ```
     786 
     787  
     788 
     789 ## 图片命名
     790 
     791  
     792 
     793 图片名称应该被统一命名以保持组织的完整。它们应该被命名为一个说明它们用途的驼峰式字符串,其次是自定义类或属性的无前缀名字(如果有的话),然后进一步说明颜色 和/或 展示位置,最后是它们的状态。
     794 
     795  
     796 
     797 **推荐:**
     798 
     799  
     800 
     801 * `RefreshBarButtonItem` / `RefreshBarButtonItem@2x` 和 `RefreshBarButtonItemSelected` / `RefreshBarButtonItemSelected@2x`
     802 
     803 * `ArticleNavigationBarWhite` / `ArticleNavigationBarWhite@2x` 和 `ArticleNavigationBarBlackSelected` / `ArticleNavigationBarBlackSelected@2x`.
     804 
     805  
     806 
     807 图片目录中被用于类似目的的图片应归入各自的组中。
     808 
     809  
     810 
     811  
     812 
     813 ## 布尔
     814 
     815  
     816 
     817 因为 `nil` 解析为 `NO`,所以没有必要在条件中与它进行比较。永远不要直接和 `YES` 进行比较,因为 `YES` 被定义为 1,而 `BOOL` 可以多达 8 位。
     818 
     819  
     820 
     821 这使得整个文件有更多的一致性和更大的视觉清晰度。
     822 
     823  
     824 
     825 **推荐:**
     826 
     827  
     828 
     829 ```objc
     830 
     831 if (!someObject) {
     832 
     833 }
     834 
     835 ```
     836 
     837  
     838 
     839 **反对:**
     840 
     841  
     842 
     843 ```objc
     844 
     845 if (someObject == nil) {
     846 
     847 }
     848 
     849 ```
     850 
     851  
     852 
     853 -----
     854 
     855  
     856 
     857 **对于 `BOOL` 来说, 这有两种用法:**
     858 
     859  
     860 
     861 ```objc
     862 
     863 if (isAwesome)
     864 
     865 if (![someObject boolValue])
     866 
     867 ```
     868 
     869  
     870 
     871 **反对:**
     872 
     873  
     874 
     875 ```objc
     876 
     877 if ([someObject boolValue] == NO)
     878 
     879 if (isAwesome == YES) // 永远别这么做
     880 
     881 ```
     882 
     883  
     884 
     885 -----
     886 
     887  
     888 
     889 如果一个 `BOOL` 属性名称是一个形容词,属性可以省略 “is” 前缀,但为 get 访问器指定一个惯用的名字,例如:
     890 
     891  
     892 
     893 ```objc
     894 
     895 @property (assign, getter=isEditable) BOOL editable;
     896 
     897 ```
     898 
     899  
     900 
     901 内容和例子来自 [Cocoa 命名指南][Booleans_1] 。
     902 
     903  
     904 
     905 [Booleans_1]:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-BAJGIIJE
     906 
     907  
     908 
     909  
     910 
     911 ## 单例
     912 
     913  
     914 
     915 单例对象应该使用线程安全的模式创建共享的实例。
     916 
     917  
     918 
     919 ```objc
     920 
     921 + (instancetype)sharedInstance {
     922 
     923    static id sharedInstance = nil;
     924 
     925  
     926 
     927    static dispatch_once_t onceToken;
     928 
     929    dispatch_once(&onceToken, ^{
     930 
     931       sharedInstance = [[self alloc] init];
     932 
     933    });
     934 
     935  
     936 
     937    return sharedInstance;
     938 
     939 }
     940 
     941 ```
     942 
     943 这将会预防[有时可能产生的许多崩溃][Singletons_1]。
     944 
     945  
     946 
     947 [Singletons_1]:http://cocoasamurai.blogspot.com/2011/04/singletons-your-doing-them-wrong.html
     948 
     949  
     950 
     951 ## 导入   
     952 
     953  
     954 
     955 如果有一个以上的 import 语句,就对这些语句进行[分组][Import_1]。每个分组的注释是可选的。   
     956 
     957 注:对于模块使用 [@import][Import_2] 语法。   
     958 
     959  
     960 
     961 ```objc   
     962 
     963 // Frameworks
     964 
     965 @import QuartzCore;
     966 
     967  
     968 
     969 // Models
     970 
     971 #import "NYTUser.h"
     972 
     973  
     974 
     975 // Views
     976 
     977 #import "NYTButton.h"
     978 
     979 #import "NYTUserView.h"
     980 
     981 ```   
     982 
     983  
     984 
     985  
     986 
     987 [Import_1]: http://ashfurrow.com/blog/structuring-modern-objective-c
     988 
     989 [Import_2]: http://clang.llvm.org/docs/Modules.html#using-modules
     990 
     991  
     992 
     993 ## Xcode 工程
     994 
     995  
     996 
     997 为了避免文件杂乱,物理文件应该保持和 Xcode 项目文件同步。Xcode 创建的任何组(group)都必须在文件系统有相应的映射。为了更清晰,代码不仅应该按照类型进行分组,也可以根据功能进行分组。
     998 
     999  
    1000 
    1001  
    1002 
    1003 如果可以的话,尽可能一直打开 target Build Settings 中 "Treat Warnings as Errors" 以及一些[额外的警告][Xcode-project_1]。如果你需要忽略指定的警告,使用 [Clang 的编译特性][Xcode-project_2] 。
    1004 
    1005  
    1006 
    1007  
    1008 
    1009 [Xcode-project_1]:http://boredzo.org/blog/archives/2009-11-07/warnings
    1010 
    1011  
    1012 
    1013 [Xcode-project_2]:http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas
    1014 
    1015  
    1016 
    1017  
    1018 
    1019 # 其他 Objective-C 风格指南
    1020 
    1021  
    1022 
    1023 如果感觉我们的不太符合你的口味,可以看看下面的风格指南:
    1024 
    1025  
    1026 
    1027 * [Google](http://google-styleguide.googlecode.com/svn/trunk/objcguide.xml)
    1028 
    1029 * [GitHub](https://github.com/github/objective-c-conventions)
    1030 
    1031 * [Adium](https://trac.adium.im/wiki/CodingStyle)
    1032 
    1033 * [Sam Soffes](https://gist.github.com/soffes/812796)
    1034 
    1035 * [CocoaDevCentral](http://cocoadevcentral.com/articles/000082.php)
    1036 
    1037 * [Luke Redpath](http://lukeredpath.co.uk/blog/my-objective-c-style-guide.html)
    1038 
    1039 * [Marcus Zarra](http://www.cimgf.com/zds-code-style-guide/)
    1040 
    1041  
  • 相关阅读:
    【2019-12-13】泛型
    【2019-12-12】函数
    【2019-12-10】类
    【2019-12-05】接口
    【2019-12-3】变量声明
    【2019-11-24】基础类型
    【2019-11-20】服务与DI简介
    【2019-11-20】组件简介
    android之ListView与Adapter(结合JavaBean)
    android基类Adapter
  • 原文地址:https://www.cnblogs.com/fshmjl/p/4852461.html
Copyright © 2011-2022 走看看