1 # Google Objective-C Style Guide 2 3 4 > Objective-C is a dynamic, object-oriented extension of C. It's designed to be 5 > easy to use and read, while enabling sophisticated object-oriented design. It 6 > is the primary development language for applications on OS X and on iOS. 7 > 8 > Apple has already written a very good, and widely accepted, [Cocoa Coding 9 > Guidelines](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html) 10 > for Objective-C. Please read it in addition to this guide. 11 > 12 > 13 > The purpose of this document is to describe the Objective-C (and 14 > Objective-C++) coding guidelines and practices that should be used for iOS and 15 > OS X code. These guidelines have evolved and been proven over time on other 16 > projects and teams. 17 > Open-source projects developed by Google conform to the requirements in this guide. 18 > 19 > Note that this guide is not an Objective-C tutorial. We assume that the reader 20 > is familiar with the language. If you are new to Objective-C or need a 21 > refresher, please read [Programming with 22 > Objective-C](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html). 23 24 25 ## Principles 26 27 ### Optimize for the reader, not the writer 28 29 Codebases often have extended lifetimes and more time is spent reading the code 30 than writing it. We explicitly choose to optimize for the experience of our 31 average software engineer reading, maintaining, and debugging code in our 32 codebase rather than the ease of writing said code. For example, when something 33 surprising or unusual is happening in a snippet of code, leaving textual hints 34 for the reader is valuable. 35 36 ### Be consistent 37 38 When the style guide allows multiple options it is preferable to pick one option 39 over mixed usage of multiple options. Using one style consistently throughout a 40 codebase lets engineers focus on other (more important) issues. Consistency also 41 enables better automation because consistent code allows more efficient 42 development and operation of tools that format or refactor code. In many cases, 43 rules that are attributed to "Be Consistent" boil down to "Just pick one and 44 stop worrying about it"; the potential value of allowing flexibility on these 45 points is outweighed by the cost of having people argue over them. 46 47 ### Be consistent with Apple SDKs 48 49 Consistency with the way Apple SDKs use Objective-C has value for the same 50 reasons as consistency within our code base. If an Objective-C feature solves a 51 problem that's an argument for using it. However, sometimes language features 52 and idioms are flawed, or were just designed with assumptions that are not 53 universal. In those cases it is appropriate to constrain or ban language 54 features or idioms. 55 56 ### Style rules should pull their weight 57 58 The benefit of a style rule must be large enough to justify asking engineers to 59 remember it. The benefit is measured relative to the codebase we would get 60 without the rule, so a rule against a very harmful practice may still have a 61 small benefit if people are unlikely to do it anyway. This principle mostly 62 explains the rules we dont have, rather than the rules we do: for example, goto 63 contravenes many of the following principles, but is not discussed due to its 64 extreme rarity. 65 66 ## Example 67 68 They say an example is worth a thousand words, so let's start off with an 69 example that should give you a feel for the style, spacing, naming, and so on. 70 71 Here is an example header file, demonstrating the correct commenting and spacing 72 for an `@interface` declaration. 73 74 ```objectivec 75 // GOOD: 76 77 #import <Foundation/Foundation.h> 78 79 @class Bar; 80 81 /** 82 * A sample class demonstrating good Objective-C style. All interfaces, 83 * categories, and protocols (read: all non-trivial top-level declarations 84 * in a header) MUST be commented. Comments must also be adjacent to the 85 * object they're documenting. 86 */ 87 @interface Foo : NSObject 88 89 /** The retained Bar. */ 90 @property(nonatomic) Bar *bar; 91 92 /** The current drawing attributes. */ 93 @property(nonatomic, copy) NSDictionary<NSString *, NSNumber *> *attributes; 94 95 /** 96 * Convenience creation method. 97 * See -initWithBar: for details about @c bar. 98 * 99 * @param bar The string for fooing. 100 * @return An instance of Foo. 101 */ 102 + (instancetype)fooWithBar:(Bar *)bar; 103 104 /** 105 * Designated initializer. 106 * 107 * @param bar A string that represents a thing that does a thing. 108 */ 109 - (instancetype)initWithBar:(Bar *)bar; 110 111 /** 112 * Does some work with @c blah. 113 * 114 * @param blah 115 * @return YES if the work was completed; NO otherwise. 116 */ 117 - (BOOL)doWorkWithBlah:(NSString *)blah; 118 119 @end 120 ``` 121 122 An example source file, demonstrating the correct commenting and spacing for the 123 `@implementation` of an interface. 124 125 ```objectivec 126 // GOOD: 127 128 #import "Shared/Util/Foo.h" 129 130 @implementation Foo { 131 /** The string used for displaying "hi". */ 132 NSString *_string; 133 } 134 135 + (instancetype)fooWithBar:(Bar *)bar { 136 return [[self alloc] initWithBar:bar]; 137 } 138 139 - (instancetype)init { 140 // Classes with a custom designated initializer should always override 141 // the superclass's designated initializer. 142 return [self initWithBar:nil]; 143 } 144 145 - (instancetype)initWithBar:(Bar *)bar { 146 self = [super init]; 147 if (self) { 148 _bar = [bar copy]; 149 _string = [[NSString alloc] initWithFormat:@"hi %d", 3]; 150 _attributes = @{ 151 @"color" : [UIColor blueColor], 152 @"hidden" : @NO 153 }; 154 } 155 return self; 156 } 157 158 - (BOOL)doWorkWithBlah:(NSString *)blah { 159 // Work should be done here. 160 return NO; 161 } 162 163 @end 164 ``` 165 166 ## Spacing and Formatting 167 168 ### Spaces vs. Tabs 169 170 Use only spaces, and indent 2 spaces at a time. We use spaces for indentation. 171 Do not use tabs in your code. 172 173 You should set your editor to emit spaces when you hit the tab key, and to trim 174 trailing spaces on lines. 175 176 ### Line Length 177 178 The maximum line length for Objective-C files is 100 columns. 179 180 You can make violations easier to spot by enabling *Preferences > Text Editing > 181 Page guide at column: 100* in Xcode. 182 183 ### Method Declarations and Definitions 184 185 One space should be used between the `-` or `+` and the return type, and no 186 spacing in the parameter list except between parameters. 187 188 Methods should look like this: 189 190 ```objectivec 191 // GOOD: 192 193 - (void)doSomethingWithString:(NSString *)theString { 194 ... 195 } 196 ``` 197 198 The spacing before the asterisk is optional. When adding new code, be consistent 199 with the surrounding file's style. 200 201 If you have too many parameters to fit on one line, giving each its own line is 202 preferred. If multiple lines are used, align each using the colon before the 203 parameter. 204 205 ```objectivec 206 // GOOD: 207 208 - (void)doSomethingWithFoo:(GTMFoo *)theFoo 209 rect:(NSRect)theRect 210 interval:(float)theInterval { 211 ... 212 } 213 ``` 214 215 When the second or later parameter name is longer than the first, indent the 216 second and later lines by at least four spaces, maintaining colon alignment: 217 218 ```objectivec 219 // GOOD: 220 221 - (void)short:(GTMFoo *)theFoo 222 longKeyword:(NSRect)theRect 223 evenLongerKeyword:(float)theInterval 224 error:(NSError **)theError { 225 ... 226 } 227 ``` 228 229 ### Conditionals 230 231 Include a space after `if`, `while`, `for`, and `switch`, and around comparison 232 operators. 233 234 ```objectivec 235 // GOOD: 236 237 for (int i = 0; i < 5; ++i) { 238 } 239 240 while (test) {}; 241 ``` 242 243 Braces may be omitted when a loop body or conditional statement fits on a single 244 line. 245 246 ```objectivec 247 // GOOD: 248 249 if (hasSillyName) LaughOutLoud(); 250 251 for (int i = 0; i < 10; i++) { 252 BlowTheHorn(); 253 } 254 ``` 255 256 ```objectivec 257 // AVOID: 258 259 if (hasSillyName) 260 LaughOutLoud(); // AVOID. 261 262 for (int i = 0; i < 10; i++) 263 BlowTheHorn(); // AVOID. 264 ``` 265 266 If an `if` clause has an `else` clause, both clauses should use braces. 267 268 ```objectivec 269 // GOOD: 270 271 if (hasBaz) { 272 foo(); 273 } else { 274 bar(); 275 } 276 ``` 277 278 ```objectivec 279 // AVOID: 280 281 if (hasBaz) foo(); 282 else bar(); // AVOID. 283 284 if (hasBaz) { 285 foo(); 286 } else bar(); // AVOID. 287 ``` 288 289 Intentional fall-through to the next case should be documented with a comment 290 unless the case has no intervening code before the next case. 291 292 ```objectivec 293 // GOOD: 294 295 switch (i) { 296 case 1: 297 ... 298 break; 299 case 2: 300 j++; 301 // Falls through. 302 case 3: { 303 int k; 304 ... 305 break; 306 } 307 case 4: 308 case 5: 309 case 6: break; 310 } 311 ``` 312 313 ### Expressions 314 315 Use a space around binary operators and assignments. Omit a space for a unary 316 operator. Do not add spaces inside parentheses. 317 318 ```objectivec 319 // GOOD: 320 321 x = 0; 322 v = w * x + y / z; 323 v = -y * (x + z); 324 ``` 325 326 Factors in an expression may omit spaces. 327 328 ```objectivec 329 // GOOD: 330 331 v = w*x + y/z; 332 ``` 333 334 ### Method Invocations 335 336 Method invocations should be formatted much like method declarations. 337 338 When there's a choice of formatting styles, follow the convention already used 339 in a given source file. Invocations should have all arguments on one line: 340 341 ```objectivec 342 // GOOD: 343 344 [myObject doFooWith:arg1 name:arg2 error:arg3]; 345 ``` 346 347 or have one argument per line, with colons aligned: 348 349 ```objectivec 350 // GOOD: 351 352 [myObject doFooWith:arg1 353 name:arg2 354 error:arg3]; 355 ``` 356 357 Don't use any of these styles: 358 359 ```objectivec 360 // AVOID: 361 362 [myObject doFooWith:arg1 name:arg2 // some lines with >1 arg 363 error:arg3]; 364 365 [myObject doFooWith:arg1 366 name:arg2 error:arg3]; 367 368 [myObject doFooWith:arg1 369 name:arg2 // aligning keywords instead of colons 370 error:arg3]; 371 ``` 372 373 As with declarations and definitions, when the first keyword is shorter than the 374 others, indent the later lines by at least four spaces, maintaining colon 375 alignment: 376 377 ```objectivec 378 // GOOD: 379 380 [myObj short:arg1 381 longKeyword:arg2 382 evenLongerKeyword:arg3 383 error:arg4]; 384 ``` 385 386 Invocations containing multiple inlined blocks may have their parameter names 387 left-aligned at a four space indent. 388 389 ### Function Calls 390 391 Function calls should include as many parameters as fit on each line, except 392 where shorter lines are needed for clarity or documentation of the parameters. 393 394 Continuation lines for function parameters may be indented to align with the 395 opening parenthesis, or may have a four-space indent. 396 397 ```objectivec 398 // GOOD: 399 400 CFArrayRef array = CFArrayCreate(kCFAllocatorDefault, objects, numberOfObjects, 401 &kCFTypeArrayCallBacks); 402 403 NSString *string = NSLocalizedStringWithDefaultValue(@"FEET", @"DistanceTable", 404 resourceBundle, @"%@ feet", @"Distance for multiple feet"); 405 406 UpdateTally(scores[x] * y + bases[x], // Score heuristic. 407 x, y, z); 408 409 TransformImage(image, 410 x1, x2, x3, 411 y1, y2, y3, 412 z1, z2, z3); 413 ``` 414 415 Use local variables with descriptive names to shorten function calls and reduce 416 nesting of calls. 417 418 ```objectivec 419 // GOOD: 420 421 double scoreHeuristic = scores[x] * y + bases[x]; 422 UpdateTally(scoreHeuristic, x, y, z); 423 ``` 424 425 ### Exceptions 426 427 Format exceptions with `@catch` and `@finally` labels on the same line as the 428 preceding `}`. Add a space between the `@` label and the opening brace (`{`), as 429 well as between the `@catch` and the caught object declaration. If you must use 430 Objective-C exceptions, format them as follows. However, see Avoid Throwing 431 Exceptions for reasons why you should not be using exceptions. 432 433 ```objectivec 434 // GOOD: 435 436 @try { 437 foo(); 438 } @catch (NSException *ex) { 439 bar(ex); 440 } @finally { 441 baz(); 442 } 443 ``` 444 445 ### Function Length 446 447 Prefer small and focused functions. 448 449 Long functions and methods are occasionally appropriate, so no hard limit is 450 placed on function length. If a function exceeds about 40 lines, think about 451 whether it can be broken up without harming the structure of the program. 452 453 Even if your long function works perfectly now, someone modifying it in a few 454 months may add new behavior. This could result in bugs that are hard to find. 455 Keeping your functions short and simple makes it easier for other people to read 456 and modify your code. 457 458 When updating legacy code, consider also breaking long functions into smaller 459 and more manageable pieces. 460 461 ### Vertical Whitespace 462 463 Use vertical whitespace sparingly. 464 465 To allow more code to be easily viewed on a screen, avoid putting blank lines 466 just inside the braces of functions. 467 468 Limit blank lines to one or two between functions and between logical groups of 469 code. 470 471 ## Naming 472 473 Names should be as descriptive as possible, within reason. Follow standard 474 [Objective-C naming 475 rules](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html). 476 477 Avoid non-standard abbreviations. Don't worry about saving horizontal space as 478 it is far more important to make your code immediately understandable by a new 479 reader. For example: 480 481 ```objectivec 482 // GOOD: 483 484 // Good names. 485 int numberOfErrors = 0; 486 int completedConnectionsCount = 0; 487 tickets = [[NSMutableArray alloc] init]; 488 userInfo = [someObject object]; 489 port = [network port]; 490 NSDate *gAppLaunchDate; 491 ``` 492 493 ```objectivec 494 // AVOID: 495 496 // Names to avoid. 497 int w; 498 int nerr; 499 int nCompConns; 500 tix = [[NSMutableArray alloc] init]; 501 obj = [someObject object]; 502 p = [network port]; 503 ``` 504 505 Any class, category, method, function, or variable name should use all capitals 506 for acronyms and 507 [initialisms](https://en.wikipedia.org/wiki/Initialism) 508 within the name. This follows Apple's standard of using all capitals within a 509 name for acronyms such as URL, ID, TIFF, and EXIF. 510 511 Names of C functions and typedefs should be capitalized and use camel case as 512 appropriate for the surrounding code. 513 514 ### File Names 515 516 File names should reflect the name of the class implementation that they 517 containincluding case. 518 519 Follow the convention that your project uses. 520 File extensions should be as follows: 521 522 Extension | Type 523 --------- | --------------------------------- 524 .h | C/C++/Objective-C header file 525 .m | Objective-C implementation file 526 .mm | Objective-C++ implementation file 527 .cc | Pure C++ implementation file 528 .c | C implementation file 529 530 Files containing code that may be shared across projects or used in a large 531 project should have a clearly unique name, typically including the project or 532 class prefix. 533 534 File names for categories should include the name of the class being extended, 535 like GTMNSString+Utils.h or NSTextView+GTMAutocomplete.h 536 537 ### Class Names 538 539 Class names (along with category and protocol names) should start as uppercase 540 and use mixed case to delimit words. 541 542 When designing code to be shared across multiple applications, prefixes are 543 acceptable and recommended (e.g. GTMSendMessage). Prefixes are also recommended 544 for classes of large applications that depend on external libraries. 545 546 ### Category Names 547 548 Category names should start with a 3 character prefix identifying the category 549 as part of a project or open for general use. 550 551 The category name should incorporate the name of the class it's extending. For 552 example, if we want to create a category on `NSString` for parsing, we would put 553 the category in a file named `NSString+GTMParsing.h`, and the category itself 554 would be named `GTMNSStringParsingAdditions`. The file name and the category may 555 not match, as this file could have many separate categories related to parsing. 556 Methods in that category should share the prefix 557 (`gtm_myCategoryMethodOnAString:`) in order to prevent collisions in 558 Objective-C's global namespace. 559 560 There should be a single space between the class name and the opening 561 parenthesis of the category. 562 563 ```objectivec 564 // GOOD: 565 566 /** A category that adds parsing functionality to NSString. */ 567 @interface NSString (GTMNSStringParsingAdditions) 568 - (NSString *)gtm_parsedString; 569 @end 570 ``` 571 572 ### Objective-C Method Names 573 574 Method and parameter names typically start as lowercase and then use mixed case. 575 576 Proper capitalization should be respected, including at the beginning of names. 577 578 ```objectivec 579 // GOOD: 580 581 + (NSURL *)URLWithString:(NSString *)URLString; 582 ``` 583 584 The method name should read like a sentence if possible, meaning you should 585 choose parameter names that flow with the method name. Objective-C method names 586 tend to be very long, but this has the benefit that a block of code can almost 587 read like prose, thus rendering many implementation comments unnecessary. 588 589 Use prepositions and conjunctions like "with", "from", and "to" in the second 590 and later parameter names only where necessary to clarify the meaning or 591 behavior of the method. 592 593 ```objectivec 594 // GOOD: 595 596 - (void)addTarget:(id)target action:(SEL)action; // GOOD; no conjunction needed 597 - (CGPoint)convertPoint:(CGPoint)point fromView:(UIView *)view; // GOOD; conjunction clarifies parameter 598 - (void)replaceCharactersInRange:(NSRange)aRange 599 withAttributedString:(NSAttributedString *)attributedString; // GOOD. 600 ``` 601 602 A method that returns an object should have a name beginning with a noun 603 identifying the object returned: 604 605 ```objectivec 606 // GOOD: 607 608 - (Sandwich *)sandwich; // GOOD. 609 ``` 610 611 ```objectivec 612 // AVOID: 613 614 - (Sandwich *)makeSandwich; // AVOID. 615 ``` 616 617 An accessor method should be named the same as the object it's getting, but it 618 should not be prefixed with the word `get`. For example: 619 620 ```objectivec 621 // GOOD: 622 623 - (id)delegate; // GOOD. 624 ``` 625 626 ```objectivec 627 // AVOID: 628 629 - (id)getDelegate; // AVOID. 630 ``` 631 632 Accessors that return the value of boolean adjectives have method names 633 beginning with `is`, but property names for those methods omit the `is`. 634 635 Dot notation is used only with property names, not with method names. 636 637 ```objectivec 638 // GOOD: 639 640 @property(nonatomic, getter=isGlorious) BOOL glorious; 641 - (BOOL)isGlorious; 642 643 BOOL isGood = object.glorious; // GOOD. 644 BOOL isGood = [object isGlorious]; // GOOD. 645 ``` 646 647 ```objectivec 648 // AVOID: 649 650 BOOL isGood = object.isGlorious; // AVOID. 651 ``` 652 653 ```objectivec 654 // GOOD: 655 656 NSArray<Frog *> *frogs = [NSArray<Frog *> arrayWithObject:frog]; 657 NSEnumerator *enumerator = [frogs reverseObjectEnumerator]; // GOOD. 658 ``` 659 660 ```objectivec 661 // AVOID: 662 663 NSEnumerator *enumerator = frogs.reverseObjectEnumerator; // AVOID. 664 ``` 665 666 See [Apple's Guide to Naming 667 Methods](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html#//apple_ref/doc/uid/20001282-BCIGIJJF) 668 for more details on Objective-C naming. 669 670 These guidelines are for Objective-C methods only. C++ method names continue to 671 follow the rules set in the C++ style guide. 672 673 ### Function Names 674 675 Regular functions have mixed case. 676 677 Ordinarily, functions should start with a capital letter and have a capital 678 letter for each new word (a.k.a. "[Camel 679 Case](https://en.wikipedia.org/wiki/Camel_case)" or "Pascal case"). 680 681 ```objectivec 682 // GOOD: 683 684 static void AddTableEntry(NSString *tableEntry); 685 static BOOL DeleteFile(char *filename); 686 ``` 687 688 Because Objective-C does not provide namespacing, non-static functions should 689 have a prefix that minimizes the chance of a name collision. 690 691 ```objectivec 692 // GOOD: 693 694 extern NSTimeZone *GTMGetDefaultTimeZone(); 695 extern NSString *GTMGetURLScheme(NSURL *URL); 696 ``` 697 698 ### Variable Names 699 700 Variable names typically start with a lowercase and use mixed case to delimit 701 words. 702 703 Instance variables have leading underscores. File scope or global variables have 704 a prefix `g`. For example: `myLocalVariable`, `_myInstanceVariable`, 705 `gMyGlobalVariable`. 706 707 #### Common Variable Names 708 709 Readers should be able to infer the variable type from the name, but do not use 710 Hungarian notation for syntactic attributes, such as the static type of a 711 variable (int or pointer). 712 713 File scope or global variables (as opposed to constants) declared outside the 714 scope of a method or function should be rare, and should have the prefix g. 715 716 ```objectivec 717 // GOOD: 718 719 static int gGlobalCounter; 720 ``` 721 722 #### Instance Variables 723 724 Instance variable names are mixed case and should be prefixed with an 725 underscore, like `_usernameTextField`. 726 727 NOTE: Google's previous convention for Objective-C ivars was a trailing 728 underscore. Existing projects may opt to continue using trailing underscores in 729 new code in order to maintain consistency within the project codebase. 730 Consistency of prefix or suffix underscores should be maintained within each 731 class. 732 733 #### Constants 734 735 Constant symbols (const global and static variables and constants created 736 with #define) should use mixed case to delimit words. 737 738 Global and file scope constants should have an appropriate prefix. 739 740 ```objectivec 741 // GOOD: 742 743 extern NSString *const GTLServiceErrorDomain; 744 745 typedef NS_ENUM(NSInteger, GTLServiceError) { 746 GTLServiceErrorQueryResultMissing = -3000, 747 GTLServiceErrorWaitTimedOut = -3001, 748 }; 749 ``` 750 751 Because Objective-C does not provide namespacing, constants with external 752 linkage should have a prefix that minimizes the chance of a name collision, 753 typically like `ClassNameConstantName` or `ClassNameEnumName`. 754 755 For interoperability with Swift code, enumerated values should have names that 756 extend the typedef name: 757 758 ```objectivec 759 // GOOD: 760 761 typedef NS_ENUM(NSInteger, DisplayTinge) { 762 DisplayTingeGreen = 1, 763 DisplayTingeBlue = 2, 764 }; 765 ``` 766 767 Constants may use a lowercase k prefix when appropriate: 768 769 ```objectivec 770 // GOOD: 771 772 static const int kFileCount = 12; 773 static NSString *const kUserKey = @"kUserKey"; 774 ``` 775 776 ## Types and Declarations 777 778 ### Local Variables 779 780 Declare variables in the narrowest practical scopes, and close to their use. 781 Initialize variables in their declarations. 782 783 ```objectivec 784 // GOOD: 785 786 CLLocation *location = [self lastKnownLocation]; 787 for (int meters = 1; meters < 10; meters++) { 788 reportFrogsWithinRadius(location, meters); 789 } 790 ``` 791 792 Occasionally, efficiency will make it more appropriate to declare a variable 793 outside the scope of its use. This example declares meters separate from 794 initialization, and needlessly sends the lastKnownLocation message each time 795 through the loop: 796 797 ```objectivec 798 // AVOID: 799 800 int meters; // AVOID. 801 for (meters = 1; meters < 10; meters++) { 802 CLLocation *location = [self lastKnownLocation]; // AVOID. 803 reportFrogsWithinRadius(location, meters); 804 } 805 ``` 806 807 Under Automatic Reference Counting, pointers to Objective-C objects are by 808 default initialized to `nil`, so explicit initialization to `nil` is not 809 required. 810 811 ### Unsigned Integers 812 813 Avoid unsigned integers except when matching types used by system interfaces. 814 815 Subtle errors crop up when doing math or counting down to zero using unsigned 816 integers. Rely only on signed integers in math expressions except when matching 817 NSUInteger in system interfaces. 818 819 ```objectivec 820 // GOOD: 821 822 NSUInteger numberOfObjects = array.count; 823 for (NSInteger counter = numberOfObjects - 1; counter > 0; --counter) 824 ``` 825 826 ```objectivec 827 // AVOID: 828 829 for (NSUInteger counter = numberOfObjects - 1; counter > 0; --counter) // AVOID. 830 ``` 831 832 Unsigned integers may be used for flags and bitmasks, though often NS_OPTIONS or 833 NS_ENUM will be more appropriate. 834 835 ### Types with Inconsistent Sizes 836 837 Due to sizes that differ in 32- and 64-bit builds, avoid types long, NSInteger, 838 NSUInteger, and CGFloat except when matching system interfaces. 839 840 Types long, NSInteger, NSUInteger, and CGFloat vary in size between 32- and 841 64-bit builds. Use of these types is appropriate when handling values exposed by 842 system interfaces, but they should be avoided for most other computations. 843 844 ```objectivec 845 // GOOD: 846 847 int32_t scalar1 = proto.intValue; 848 849 int64_t scalar2 = proto.longValue; 850 851 NSUInteger numberOfObjects = array.count; 852 853 CGFloat offset = view.bounds.origin.x; 854 ``` 855 856 ```objectivec 857 // AVOID: 858 859 NSInteger scalar2 = proto.longValue; // AVOID. 860 ``` 861 862 File and buffer sizes often exceed 32-bit limits, so they should be declared 863 using `int64_t`, not with `long`, `NSInteger`, or `NSUInteger`. 864 865 ## Comments 866 867 Comments are absolutely vital to keeping our code readable. The following rules 868 describe what you should comment and where. But remember: while comments are 869 important, the best code is self-documenting. Giving sensible names to types and 870 variables is much better than using obscure names and then trying to explain 871 them through comments. 872 873 Pay attention to punctuation, spelling, and grammar; it is easier to read 874 well-written comments than badly written ones. 875 876 Comments should be as readable as narrative text, with proper capitalization and 877 punctuation. In many cases, complete sentences are more readable than sentence 878 fragments. Shorter comments, such as comments at the end of a line of code, can 879 sometimes be less formal, but use a consistent style. 880 When writing your comments, write for your audience: the next contributor who will need to understand your code. Be generousthe next one may be you! 881 882 ### File Comments 883 884 A file may optionally start with a description of its contents. 885 Every file may contain the following items, in order: 886 * License boilerplate if necessary. Choose the appropriate boilerplate for the license used by the project. 887 * A basic description of the contents of the file if necessary. 888 889 If you make significant changes to a file with an author line, consider deleting 890 the author line since revision history already provides a more detailed and 891 accurate record of authorship. 892 893 894 ### Declaration Comments 895 896 Every non-trivial interface, public and private, should have an accompanying 897 comment describing its purpose and how it fits into the larger picture. 898 899 Comments should be used to document classes, properties, ivars, functions, 900 categories, protocol declarations, and enums. 901 902 ```objectivec 903 // GOOD: 904 905 /** 906 * A delegate for NSApplication to handle notifications about app 907 * launch and shutdown. Owned by the main app controller. 908 */ 909 @interface MyAppDelegate : NSObject { 910 /** 911 * The background task in progress, if any. This is initialized 912 * to the value UIBackgroundTaskInvalid. 913 */ 914 UIBackgroundTaskIdentifier _backgroundTaskID; 915 } 916 917 /** The factory that creates and manages fetchers for the app. */ 918 @property(nonatomic) GTMSessionFetcherService *fetcherService; 919 920 @end 921 ``` 922 923 Doxygen-style comments are encouraged for interfaces as they are parsed by Xcode 924 to display formatted documentation. There is a wide variety of Doxygen commands; 925 use them consistently within a project. 926 927 If you have already described an interface in detail in the comments at the top 928 of your file, feel free to simply state, "See comment at top of file for a 929 complete description", but be sure to have some sort of comment. 930 931 Additionally, each method should have a comment explaining its function, 932 arguments, return value, thread or queue assumptions, and any side effects. 933 Documentation comments should be in the header for public methods, or 934 immediately preceding the method for non-trivial private methods. 935 936 Use descriptive form ("Opens the file") rather than imperative form ("Open the 937 file") for method and function comments. The comment describes the function; it 938 does not tell the function what to do. 939 940 Document the thread usage assumptions the class, properties, or methods make, if 941 any. If an instance of the class can be accessed by multiple threads, take extra 942 care to document the rules and invariants surrounding multithreaded use. 943 944 Any sentinel values for properties and ivars, such as `NULL` or `-1`, should be 945 documented in comments. 946 947 Declaration comments explain how a method or function is used. Comments 948 explaining how a method or function is implemented should be with the 949 implementation rather than with the declaration. 950 951 ### Implementation Comments 952 953 Provide comments explaining tricky, subtle, or complicated sections of code. 954 955 ```objectivec 956 // GOOD: 957 958 // Set the property to nil before invoking the completion handler to 959 // avoid the risk of reentrancy leading to the callback being 960 // invoked again. 961 CompletionHandler handler = self.completionHandler; 962 self.completionHandler = nil; 963 handler(); 964 ``` 965 966 When useful, also provide comments about implementation approaches that were 967 considered or abandoned. 968 969 End-of-line comments should be separated from the code by at least 2 spaces. If 970 you have several comments on subsequent lines, it can often be more readable to 971 line them up. 972 973 ```objectivec 974 // GOOD: 975 976 [self doSomethingWithALongName]; // Two spaces before the comment. 977 [self doSomethingShort]; // More spacing to align the comment. 978 ``` 979 980 ### Disambiguating Symbols 981 982 Where needed to avoid ambiguity, use backticks or vertical bars to quote 983 variable names and symbols in comments in preference to using quotation marks 984 or naming the symbols inline. 985 986 In Doxygen-style comments, prefer demarcating symbols with a monospace text 987 command, such as `@c`. 988 989 Demarcation helps provide clarity when a symbol is a common word that might make 990 the sentence read like it was poorly constructed. A common example is the symbol 991 `count`: 992 993 ```objectivec 994 // GOOD: 995 996 // Sometimes `count` will be less than zero. 997 ``` 998 999 or when quoting something which already contains quotes 1000 1001 ```objectivec 1002 // GOOD: 1003 1004 // Remember to call `StringWithoutSpaces("foo bar baz")` 1005 ``` 1006 1007 Backticks or vertical bars are not needed when a symbol is self-apparent. 1008 1009 ```objectivec 1010 // GOOD: 1011 1012 // This class serves as a delegate to GTMDepthCharge. 1013 ``` 1014 1015 Doxygen formatting is also suitable for identifying symbols. 1016 1017 ```objectivec 1018 // GOOD: 1019 1020 /** @param maximum The highest value for @c count. */ 1021 ``` 1022 1023 ### Object Ownership 1024 1025 For objects not managed by ARC, make the pointer ownership model as explicit as 1026 possible when it falls outside the most common Objective-C usage idioms. 1027 1028 #### Manual Reference Counting 1029 1030 Instance variables for NSObject-derived objects are presumed to be retained; if 1031 they are not retained, they should be either commented as weak or declared with 1032 the `__weak` lifetime qualifier. 1033 1034 An exception is in Mac software for instance variables labeled as `@IBOutlets`, 1035 which are presumed to not be retained. 1036 1037 Where instance variables are pointers to Core Foundation, C++, and other 1038 non-Objective-C objects, they should always be declared with strong and weak 1039 comments to indicate which pointers are and are not retained. Core Foundation 1040 and other non-Objective-C object pointers require explicit memory management, 1041 even when building for automatic reference counting. 1042 1043 Examples of strong and weak declarations: 1044 1045 ```objectivec 1046 // GOOD: 1047 1048 @interface MyDelegate : NSObject 1049 1050 @property(nonatomic) NSString *doohickey; 1051 @property(nonatomic, weak) NSString *parent; 1052 1053 @end 1054 1055 1056 @implementation MyDelegate { 1057 IBOutlet NSButton *_okButton; // Normal NSControl; implicitly weak on Mac only 1058 1059 AnObjcObject *_doohickey; // My doohickey 1060 __weak MyObjcParent *_parent; // To send messages back (owns this instance) 1061 1062 // non-NSObject pointers... 1063 CWackyCPPClass *_wacky; // Strong, some cross-platform object 1064 CFDictionaryRef *_dict; // Strong 1065 } 1066 @end 1067 ``` 1068 1069 #### Automatic Reference Counting 1070 1071 Object ownership and lifetime are explicit when using ARC, so no additional 1072 comments are required for automatically retained objects. 1073 1074 ## C Language Features 1075 1076 ### Macros 1077 1078 Avoid macros, especially where `const` variables, enums, XCode snippets, or C 1079 functions may be used instead. 1080 1081 Macros make the code you see different from the code the compiler sees. Modern C 1082 renders traditional uses of macros for constants and utility functions 1083 unnecessary. Macros should only be used when there is no other solution 1084 available. 1085 1086 Where a macro is needed, use a unique name to avoid the risk of a symbol 1087 collision in the compilation unit. If practical, keep the scope limited by 1088 `#undefining` the macro after its use. 1089 1090 Macro names should use `SHOUTY_SNAKE_CASE`all uppercase letters with 1091 underscores between words. Function-like macros may use C function naming 1092 practices. Do not define macros that appear to be C or Objective-C keywords. 1093 1094 ```objectivec 1095 // GOOD: 1096 1097 #define GTM_EXPERIMENTAL_BUILD ... // GOOD 1098 1099 // Assert unless X > Y 1100 #define GTM_ASSERT_GT(X, Y) ... // GOOD, macro style. 1101 1102 // Assert unless X > Y 1103 #define GTMAssertGreaterThan(X, Y) ... // GOOD, function style. 1104 ``` 1105 1106 ```objectivec 1107 // AVOID: 1108 1109 #define kIsExperimentalBuild ... // AVOID 1110 1111 #define unless(X) if(!(X)) // AVOID 1112 ``` 1113 1114 Avoid macros that expand to unbalanced C or Objective-C constructs. Avoid macros 1115 that introduce scope, or may obscure the capturing of values in blocks. 1116 1117 Avoid macros that generate class, property, or method definitions in 1118 headers to be used as public API. These only make the code hard to 1119 understand, and the language already has better ways of doing this. 1120 1121 Avoid macros that generate method implementations, or that generate declarations 1122 of variables that are later used outside of the macro. Macros shouldn't make 1123 code hard to understand by hiding where and how a variable is declared. 1124 1125 ```objectivec 1126 // AVOID: 1127 1128 #define ARRAY_ADDER(CLASS) \ 1129 -(void)add ## CLASS ## :(CLASS *)obj toArray:(NSMutableArray *)array 1130 1131 ARRAY_ADDER(NSString) { 1132 if (array.count > 5) { // AVOID -- where is 'array' defined? 1133 ... 1134 } 1135 } 1136 ``` 1137 1138 Examples of acceptable macro use include assertion and debug logging macros 1139 that are conditionally compiled based on build settingsoften, these are 1140 not compiled into release builds. 1141 1142 ### Nonstandard Extensions 1143 1144 Nonstandard extensions to C/Objective-C may not be used unless otherwise 1145 specified. 1146 1147 Compilers support various extensions that are not part of standard C. Examples 1148 include compound statement expressions (e.g. `foo = ({ int x; Bar(&x); x }))` 1149 and variable-length arrays. 1150 1151 `__attribute__` is an approved exception, as it is used in Objective-C API 1152 specifications. 1153 1154 The binary form of the conditional operator, `A ?: B`, is an approved exception. 1155 1156 ## Cocoa and Objective-C Features 1157 1158 ### Identify Designated Initializer 1159 1160 Clearly identify your designated initializer. 1161 1162 It is important for those who might be subclassing your class that the 1163 designated initializer be clearly identified. That way, they only need to 1164 override a single initializer (of potentially several) to guarantee the 1165 initializer of their subclass is called. It also helps those debugging your 1166 class in the future understand the flow of initialization code if they need to 1167 step through it. Identify the designated initializer using comments or the 1168 `NS_DESIGNATED_INITIALIZER` macro. If you use `NS_DESIGNATED_INITIALIZER`, mark 1169 unsupported initializers with `NS_UNAVAILABLE`. 1170 1171 ### Override Designated Initializer 1172 1173 When writing a subclass that requires an `init...` method, make sure you 1174 override the designated initializer of the superclass. 1175 1176 If you fail to override the designated initializer of the superclass, your 1177 initializer may not be called in all cases, leading to subtle and very difficult 1178 to find bugs. 1179 1180 ### Overridden NSObject Method Placement 1181 1182 Put overridden methods of NSObject at the top of an `@implementation`. 1183 1184 This commonly applies to (but is not limited to) the `init...`, `copyWithZone:`, 1185 and `dealloc` methods. The `init...` methods should be grouped together, 1186 followed by other typical `NSObject` methods such as `description`, `isEqual:`, 1187 and `hash`. 1188 1189 Convenience class factory methods for creating instances may precede the 1190 `NSObject` methods. 1191 1192 ### Initialization 1193 1194 Don't initialize instance variables to `0` or `nil` in the `init` method; doing 1195 so is redundant. 1196 1197 All instance variables for a newly allocated object are [initialized 1198 to](https://developer.apple.com/library/mac/documentation/General/Conceptual/CocoaEncyclopedia/ObjectAllocation/ObjectAllocation.html) 1199 `0` (except for isa), so don't clutter up the init method by re-initializing 1200 variables to `0` or `nil`. 1201 1202 ### Instance Variables In Headers Should Be @protected or @private 1203 1204 Instance variables should typically be declared in implementation files or 1205 auto-synthesized by properties. When ivars are declared in a header file, they 1206 should be marked `@protected` or `@private`. 1207 1208 ```objectivec 1209 // GOOD: 1210 1211 @interface MyClass : NSObject { 1212 @protected 1213 id _myInstanceVariable; 1214 } 1215 @end 1216 ``` 1217 1218 ### Avoid +new 1219 1220 Do not invoke the `NSObject` class method `new`, nor override it in a subclass. 1221 Instead, use `alloc` and `init` methods to instantiate retained objects. 1222 1223 Modern Objective-C code explicitly calls `alloc` and an `init` method to create 1224 and retain an object. As the `new` class method is rarely used, it makes 1225 reviewing code for correct memory management more difficult. 1226 1227 ### Keep the Public API Simple 1228 1229 Keep your class simple; avoid "kitchen-sink" APIs. If a method doesn't need to 1230 be public, keep it out of the public interface. 1231 1232 Unlike C++, Objective-C doesn't differentiate between public and private 1233 methods; any message may be sent to an object. As a result, avoid placing 1234 methods in the public API unless they are actually expected to be used by a 1235 consumer of the class. This helps reduce the likelihood they'll be called when 1236 you're not expecting it. This includes methods that are being overridden from 1237 the parent class. 1238 1239 Since internal methods are not really private, it's easy to accidentally 1240 override a superclass's "private" method, thus making a very difficult bug to 1241 squash. In general, private methods should have a fairly unique name that will 1242 prevent subclasses from unintentionally overriding them. 1243 1244 ### #import and #include 1245 1246 `#import` Objective-C and Objective-C++ headers, and `#include` C/C++ headers. 1247 1248 Choose between `#import` and `#include` based on the language of the header that 1249 you are including. 1250 1251 1252 When including a header that uses Objective-C or Objective-C++, use `#import`. 1253 When including a standard C or C++ header, use `#include`. 1254 The header should provide its own `#define` guard. 1255 1256 ### Order of Includes 1257 1258 The standard order for header inclusion is the related header, operating system 1259 headers, language library headers, and finally groups of headers for other 1260 dependencies. 1261 1262 The related header precedes others to ensure it has no hidden dependencies. 1263 For implementation files the related header is the header file. 1264 For test files the related header is the header containing the tested interface. 1265 1266 A blank line may separate logically distinct groups of included headers. 1267 1268 Import headers using their path relative to the project's source directory. 1269 1270 ```objectivec 1271 // GOOD: 1272 1273 #import "ProjectX/BazViewController.h" 1274 1275 #import <Foundation/Foundation.h> 1276 1277 #include <unistd.h> 1278 #include <vector> 1279 1280 #include "base/basictypes.h" 1281 #include "base/integral_types.h" 1282 #include "util/math/mathutil.h" 1283 1284 #import "ProjectX/BazModel.h" 1285 #import "Shared/Util/Foo.h" 1286 ``` 1287 1288 ### Use Umbrella Headers for System Frameworks 1289 1290 Import umbrella headers for system frameworks and system libraries rather than 1291 include individual files. 1292 1293 While it may seem tempting to include individual system headers from a framework 1294 such as Cocoa or Foundation, in fact it's less work on the compiler if you 1295 include the top-level root framework. The root framework is generally 1296 pre-compiled and can be loaded much more quickly. In addition, remember to use 1297 `@import` or `#import` rather than `#include` for Objective-C frameworks. 1298 1299 ```objectivec 1300 // GOOD: 1301 1302 @import UIKit; // GOOD. 1303 #import <Foundation/Foundation.h> // GOOD. 1304 ``` 1305 1306 ```objectivec 1307 // AVOID: 1308 1309 #import <Foundation/NSArray.h> // AVOID. 1310 #import <Foundation/NSString.h> 1311 ... 1312 ``` 1313 1314 ### Avoid Messaging the Current Object Within Initializers and `-dealloc` 1315 1316 Code in initializers and `-dealloc` should avoid invoking instance methods. 1317 1318 Superclass initialization completes before subclass initialization. Until all 1319 classes have had a chance to initialize their instance state any method 1320 invocation on self may lead to a subclass operating on uninitialized instance 1321 state. 1322 1323 A similar issue exists for `-dealloc`, where a method invocation may cause a 1324 class to operate on state that has been deallocated. 1325 1326 One case where this is less obvious is property accessors. These can be 1327 overridden just like any other selector. Whenever practical, directly assign to 1328 and release ivars in initializers and `-dealloc`, rather than rely on accessors. 1329 1330 ```objectivec 1331 // GOOD: 1332 1333 - (instancetype)init { 1334 self = [super init]; 1335 if (self) { 1336 _bar = 23; // GOOD. 1337 } 1338 return self; 1339 } 1340 ``` 1341 1342 Beware of factoring common initialization code into helper methods: 1343 1344 - Methods can be overridden in subclasses, either deliberately, or 1345 accidentally due to naming collisions. 1346 - When editing a helper method, it may not be obvious that the code is being 1347 run from an initializer. 1348 1349 ```objectivec 1350 // AVOID: 1351 1352 - (instancetype)init { 1353 self = [super init]; 1354 if (self) { 1355 self.bar = 23; // AVOID. 1356 [self sharedMethod]; // AVOID. Fragile to subclassing or future extension. 1357 } 1358 return self; 1359 } 1360 ``` 1361 1362 ```objectivec 1363 // GOOD: 1364 1365 - (void)dealloc { 1366 [_notifier removeObserver:self]; // GOOD. 1367 } 1368 ``` 1369 1370 ```objectivec 1371 // AVOID: 1372 1373 - (void)dealloc { 1374 [self removeNotifications]; // AVOID. 1375 } 1376 ``` 1377 1378 ### Setters copy NSStrings 1379 1380 Setters taking an `NSString` should always copy the string it accepts. This is 1381 often also appropriate for collections like `NSArray` and `NSDictionary`. 1382 1383 Never just retain the string, as it may be a `NSMutableString`. This avoids the 1384 caller changing it under you without your knowledge. 1385 1386 Code receiving and holding collection objects should also consider that the 1387 passed collection may be mutable, and thus the collection could be more safely 1388 held as a copy or mutable copy of the original. 1389 1390 ```objectivec 1391 // GOOD: 1392 1393 @property(nonatomic, copy) NSString *name; 1394 1395 - (void)setZigfoos:(NSArray<Zigfoo *> *)zigfoos { 1396 // Ensure that we're holding an immutable collection. 1397 _zigfoos = [zigfoos copy]; 1398 } 1399 ``` 1400 1401 ### Use Lightweight Generics to Document Contained Types 1402 1403 All projects compiling on Xcode 7 or newer versions should make use of the 1404 Objective-C lightweight generics notation to type contained objects. 1405 1406 Every `NSArray`, `NSDictionary`, or `NSSet` reference should be declared using 1407 lightweight generics for improved type safety and to explicitly document usage. 1408 1409 ```objectivec 1410 // GOOD: 1411 1412 @property(nonatomic, copy) NSArray<Location *> *locations; 1413 @property(nonatomic, copy, readonly) NSSet<NSString *> *identifiers; 1414 1415 NSMutableArray<MyLocation *> *mutableLocations = [otherObject.locations mutableCopy]; 1416 ``` 1417 1418 If the fully-annotated types become complex, consider using a typedef to 1419 preserve readability. 1420 1421 ```objectivec 1422 // GOOD: 1423 1424 typedef NSSet<NSDictionary<NSString *, NSDate *> *> TimeZoneMappingSet; 1425 TimeZoneMappingSet *timeZoneMappings = [TimeZoneMappingSet setWithObjects:...]; 1426 ``` 1427 1428 Use the most descriptive common superclass or protocol available. In the most 1429 generic case when nothing else is known, declare the collection to be explicitly 1430 heterogenous using id. 1431 1432 ```objectivec 1433 // GOOD: 1434 1435 @property(nonatomic, copy) NSArray<id> *unknowns; 1436 ``` 1437 1438 ### Avoid Throwing Exceptions 1439 1440 Don't `@throw` Objective-C exceptions, but you should be prepared to catch them 1441 from third-party or OS calls. 1442 1443 This follows the recommendation to use error objects for error delivery in 1444 [Apple's Introduction to Exception Programming Topics for 1445 Cocoa](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Exceptions/Exceptions.html). 1446 1447 We do compile with `-fobjc-exceptions` (mainly so we get `@synchronized`), but 1448 we don't `@throw`. Use of `@try`, `@catch`, and `@finally` are allowed when 1449 required to properly use 3rd party code or libraries. If you do use them, please 1450 document exactly which methods you expect to throw. 1451 1452 ### `nil` Checks 1453 1454 Use `nil` checks for logic flow only. 1455 1456 Use `nil` pointer checks for logic flow of the application, not for preventing 1457 crashes when sending messages. Sending a message to `nil` [reliably 1458 returns](http://www.sealiesoftware.com/blog/archive/2012/2/29/objc_explain_return_value_of_message_to_nil.html) 1459 `nil` as a pointer, zero as an integer or floating-point value, structs 1460 initialized to `0`, and `_Complex` values equal to `{0, 0}`. 1461 1462 Note that this applies to `nil` as a message target, not as a parameter value. 1463 Individual methods may or may not safely handle `nil` parameter values. 1464 1465 Note too that this is distinct from checking C/C++ pointers and block pointers 1466 against `NULL`, which the runtime does not handle and will cause your 1467 application to crash. You still need to make sure you do not dereference a 1468 `NULL` pointer. 1469 1470 ### BOOL Pitfalls 1471 1472 Be careful when converting general integral values to `BOOL`. Avoid comparing 1473 directly with `YES`. 1474 1475 `BOOL` in OS X and in 32-bit iOS builds is defined as a signed `char`, so it may 1476 have values other than `YES` (`1`) and `NO` (`0`). Do not cast or convert 1477 general integral values directly to `BOOL`. 1478 1479 Common mistakes include casting or converting an array's size, a pointer value, 1480 or the result of a bitwise logic operation to a `BOOL` that could, depending on 1481 the value of the last byte of the integer value, still result in a `NO` value. 1482 When converting a general integral value to a `BOOL` use ternary operators to 1483 return a `YES` or `NO` value. 1484 1485 You can safely interchange and convert `BOOL`, `_Bool` and `bool` (see C++ Std 1486 4.7.4, 4.12 and C99 Std 6.3.1.2). Use `BOOL` in Objective-C method signatures. 1487 1488 Using logical operators (`&&`, `||` and `!`) with `BOOL` is also valid and will 1489 return values that can be safely converted to `BOOL` without the need for a 1490 ternary operator. 1491 1492 ```objectivec 1493 // AVOID: 1494 1495 - (BOOL)isBold { 1496 return [self fontTraits] & NSFontBoldTrait; // AVOID. 1497 } 1498 - (BOOL)isValid { 1499 return [self stringValue]; // AVOID. 1500 } 1501 ``` 1502 1503 ```objectivec 1504 // GOOD: 1505 1506 - (BOOL)isBold { 1507 return ([self fontTraits] & NSFontBoldTrait) ? YES : NO; 1508 } 1509 - (BOOL)isValid { 1510 return [self stringValue] != nil; 1511 } 1512 - (BOOL)isEnabled { 1513 return [self isValid] && [self isBold]; 1514 } 1515 ``` 1516 1517 Also, don't directly compare `BOOL` variables directly with `YES`. Not only is 1518 it harder to read for those well-versed in C, but the first point above 1519 demonstrates that return values may not always be what you expect. 1520 1521 ```objectivec 1522 // AVOID: 1523 1524 BOOL great = [foo isGreat]; 1525 if (great == YES) { // AVOID. 1526 // ...be great! 1527 } 1528 ``` 1529 1530 ```objectivec 1531 // GOOD: 1532 1533 BOOL great = [foo isGreat]; 1534 if (great) { // GOOD. 1535 // ...be great! 1536 } 1537 ``` 1538 1539 ### Interfaces Without Instance Variables 1540 1541 Omit the empty set of braces on interfaces that do not declare any instance 1542 variables. 1543 1544 ```objectivec 1545 // GOOD: 1546 1547 @interface MyClass : NSObject 1548 // Does a lot of stuff. 1549 - (void)fooBarBam; 1550 @end 1551 ``` 1552 1553 ```objectivec 1554 // AVOID: 1555 1556 @interface MyClass : NSObject { 1557 } 1558 // Does a lot of stuff. 1559 - (void)fooBarBam; 1560 @end 1561 ``` 1562 1563 ## Cocoa Patterns 1564 1565 ### Delegate Pattern 1566 1567 Delegates, target objects, and block pointers should not be retained when doing 1568 so would create a retain cycle. 1569 1570 To avoid causing a retain cycle, a delegate or target pointer should be released 1571 as soon as it is clear there will no longer be a need to message the object. 1572 1573 If there is no clear time at which the delegate or target pointer is no longer 1574 needed, the pointer should only be retained weakly. 1575 1576 Block pointers cannot be retained weakly. To avoid causing retain cycles in the 1577 client code, block pointers should be used for callbacks only where they can be 1578 explicitly released after they have been called or once they are no longer 1579 needed. Otherwise, callbacks should be done via weak delegate or target 1580 pointers. 1581 1582 ## Objective-C++ 1583 1584 ### Style Matches the Language 1585 1586 Within an Objective-C++ source file, follow the style for the language of the 1587 function or method you're implementing. In order to minimize clashes between the 1588 differing naming styles when mixing Cocoa/Objective-C and C++, follow the style 1589 of the method being implemented. 1590 1591 For code in an `@implementation` block, use the Objective-C naming rules. For 1592 code in a method of a C++ class, use the C++ naming rules. 1593 1594 For code in an Objective-C++ file outside of a class implementation, be 1595 consistent within the file. 1596 1597 ```objectivec++ 1598 // GOOD: 1599 1600 // file: cross_platform_header.h 1601 1602 class CrossPlatformAPI { 1603 public: 1604 ... 1605 int DoSomethingPlatformSpecific(); // impl on each platform 1606 private: 1607 int an_instance_var_; 1608 }; 1609 1610 // file: mac_implementation.mm 1611 #include "cross_platform_header.h" 1612 1613 // A typical Objective-C class, using Objective-C naming. 1614 @interface MyDelegate : NSObject { 1615 @private 1616 int _instanceVar; 1617 CrossPlatformAPI* _backEndObject; 1618 } 1619 1620 - (void)respondToSomething:(id)something; 1621 1622 @end 1623 1624 @implementation MyDelegate 1625 1626 - (void)respondToSomething:(id)something { 1627 // bridge from Cocoa through our C++ backend 1628 _instanceVar = _backEndObject->DoSomethingPlatformSpecific(); 1629 NSString* tempString = [NSString stringWithFormat:@"%d", _instanceVar]; 1630 NSLog(@"%@", tempString); 1631 } 1632 1633 @end 1634 1635 // The platform-specific implementation of the C++ class, using 1636 // C++ naming. 1637 int CrossPlatformAPI::DoSomethingPlatformSpecific() { 1638 NSString* temp_string = [NSString stringWithFormat:@"%d", an_instance_var_]; 1639 NSLog(@"%@", temp_string); 1640 return [temp_string intValue]; 1641 } 1642 ``` 1643 1644 Projects may opt to use an 80 column line length limit for consistency with 1645 Google's C++ style guide. 1646 1647 ## Objective-C Style Exceptions 1648 1649 ### Indicating style exceptions 1650 1651 Lines of code that are not expected to adhere to these style recommendations 1652 require `// NOLINT` at the end of the line or `// NOLINTNEXTLINE` at the end of 1653 the previous line. Sometimes it is required that parts of Objective-C code must 1654 ignore these style recommendations (for example code may be machine generated or 1655 code constructs are such that its not possible to style correctly). 1656 1657 A `// NOLINT` comment on that line or `// NOLINTNEXTLINE` on the previous line 1658 can be used to indicate to the reader that code is intentionally ignoring style 1659 guidelines. In addition these annotations can also be picked up by automated 1660 tools such as linters and handle code correctly. Note that there is a single 1661 space between `//` and `NOLINT*`. 1662