Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tips & Tricks of Effective iOS Developers

Tips & Tricks of Effective iOS Developers

Talk given at CocoaConf Chicago, 2014

Ben Scheirman

March 08, 2014
Tweet

More Decks by Ben Scheirman

Other Decks in Programming

Transcript

  1. ME?

  2. Always use braces for conditionals if ([self isHungry]) { [self

    eatBurger]; } if ([self isHungry]) [self eatBurger]; if ([self isHungry]) [self eatBurger]; [self takeNap]; if ([self isHungry]) { [self eatBurger]; [self takeNap]; }
  3. if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) goto fail; if

    ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail; goto fail; if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) goto fail; ... ! fail: SSLFreeBuffer(&signedHashes); SSLFreeBuffer(&hashCtx); return err; Always use braces for conditionals
  4. @interface Player ! - (void)moveLeft; - (void)moveRight; - (void)jump; -

    (void)hit; ! @end Use Class Continuations for Private Properties @interface Player () @property CGFloat health; @property Texture *texture; @end ! @implementation Player … @end Player.h Player.m
  5. Use Class Continuations for Private Properties @interface ViewController () @property

    IBOutlet UILabel *label; @end ! @implementation ViewController … @end
  6. Use intention revealing method names - (NSDate *)nextDate:(NSDate *); -

    (NSDate *)nextBillingDateAfterDate:(NSDate *);
  7. - (void)viewDidLoad { [self.fetchedResultsController performFetch:nil]; } Lazily Initialize Properties -

    (NSFetchedResultsController *)fetchedResultsController { if (_frc == nil) { _frc = [[NSFetchedResultsController alloc] initWithFetchRequest: self.fetchRequest ... ] } ! return _frc; }
  8. Use Refactor Method judiciously - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)

    indexPath { UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@“cell”]; NSArray *peopleInSection = self.sections[indexPath.section]; Person *person = peopleInSection[indexPath.row]; cell.textLabel.text = [NSString stringWithFormat:@“%@ %@“, person.firstName, person.lastName]; cell.detailTextLabel.text = person.email; return cell; }
  9. Use Refactor Method judiciously - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)

    indexPath { UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@“cell”]; Person *person = [self personAtIndexPath:indexPath]; cell.textLabel.text = [NSString stringWithFormat:@“%@ %@“, person.firstName, person.lastName]; cell.detailTextLabel.text = person.email; return cell; }
  10. Use Refactor Method judiciously - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)

    indexPath { UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@“cell”]; Person *person = [self personAtIndexPath:indexPath]; cell.textLabel.text = person.fullName; cell.detailTextLabel.text = person.email; return cell; }
  11. Use Refactor Method judiciously - (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)

    indexPath { UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:@“cell”]; Person *person = [self personAtIndexPath:indexPath]; [self updateCell:cell forPerson:person]; return cell; }
  12. awk

  13. find "${SRCROOT}" \(-name "*.h" -or -name "*.m"\) -and \( -path

    "${SRCROOT}/Pods/*" -prune -o -print0 \) | xargs -0 wc -l | awk '$1 > 400 && $2 != "total" { for(i=2;i<NF;i++) { printf "%s%s", $i, " “ } print $NF ":1: warning: File more than 400 lines (" $1 "), consider refactoring." }' http://matthewmorey.com/improved-xcode-build-phases/
  14. http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html Capitalized, short (50 chars or less) summary ! More

    detailed explanatory text, if necessary. Wrap it to about 72 characters or so. In some contexts, the first line is treated as the subject of an email and the rest of the text as the body. The blank line separating the summary from the body is critical (unless you omit the body entirely); tools like rebase can get confused if you run the two together. ! Write your commit message in the imperative: "Fix bug" and not "Fixed bug" or "Fixes bug." This convention matches up with commit messages generated by commands like git merge and git revert. ! Further paragraphs come after blank lines. ! - Bullet points are okay, too ! - Typically a hyphen or asterisk is used for the bullet, followed by a single space, with blank lines in between, but conventions vary here ! - Use a hanging indent
  15. $ git log --oneline ! 9511f6c Add mixpanel gem 47a3e6d

    Add a sleep to not get throttled by facebook ce30dcb Kick Jenkins build 2e6802f Merge pull request #981 from DeliRadio/venue-favorites-rabls 99eb628 stub master account to avoid fail when run in test suite. b4e0435 before(:all) -> before(:each) to avoid certain test to fail when execute e4b10b6 Update schema 7b1e053 Fix banner check for venues in autocomplete 83ca7cb Update ci reporter 6eae32f Fix admin manages events spec. 7c8902b Add new line at the end of file so Github likes it. a153a48 Call Rails.application.eager_load! right before it is needed so that its 4a4d050 Refactoring test so it finishes faster. 4155ac6 fix crash when correcting country code from geolocated params 08c5bdb Proper auth token generation for facebook login: 4efaf1e Venue needs to have shareable_id and shareable_type implementation. Defa a9cdd7a Implemented a test to check shareable_id and shareable_type. Since Favor 9e1e6c2 fix after_party task syntax dde3ae9 add after_party task to fill in fb birthdays where we can 6e99a74 Implemented tests to check renderability of all ActiveRecord instance th b174af9 Added four templates that are required for favoritable items. 07218a0 year_of_birth, not birth_year be562bf update attribs from fb even for existing users 29041f0 Add logging to facebook oauth responses
  16. ?

  17. “I attempt to keep the app in a working state

    as much as possible. That means test driving small changes, committing often, and only hooking things up to the UI when I think they're ready…”
  18. “… If I'm not in a position to push my

    code at least every hour or so, I feel like I haven't broken my work down properly”
  19. “I'm not a great programmer; I'm just a good programmer

    with great habits.” ! - Kent Beck
  20. “I form opinions about the code I study. Not all

    of it is good. I want to reflect on why I feel that way.”
  21. “Before asking for advice, take a careful look at what

    you know and what you are looking to have answered. Often that will put you in a spot where you answer your own question.” ! !
  22. “Don't just program in Objective C, make sure you regularly

    use another language. There is a lot we can learn from other technologies and communities” ! - Stew Gleadow ! !