E se eu tivesse um DeLorean? - TDC 2012

E se eu tivesse um DeLorean? - TDC 2012

Já imaginou como seriam as coisas se você soubesse o que você sabe hoje, alguns anos atrás? Essa palestra tem como objetivo dar algumas dicas que eu queria ter recebido, em relação ao ecossistema iOS, performance, código, e muito mais!

(Palestra apresentada na trilha de iOS do TDC SP 2012)

841a0284060fa6faa652e95a467dcc69?s=128

Marcelo Fabri

July 04, 2012
Tweet

Transcript

  1. E se eu tivesse um DeLorean?! Marcelo Fabri Dextra Sistemas

    http://www.dextra.com.br/ @marcelofabri_ Dicas para o Eu do passado
  2. E se eu tivesse um DeLorean?!

  3. Planejamento •Por onde começar? •Dicas gerais •Problemas de performance •Bibliotecas

    úteis
  4. Por onde começar? •iOS Dev Center https://developer.apple.com/devcenter/ios •Vídeos da WWDC

    https://developer.apple.com/videos •Ray Wenderlich http://raywenderlich.com/ •StackOver ow http://stackoverflow.com
  5. Conheça o ecossistema •Acostume-se com Objective-C e seus paradigmas! •Se

    possível, tenha um iDevice •iOS Human Interface Guidelines http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig •App Store Review Guidelines https://developer.apple.com/appstore/guidelines.html
  6. http://www.textfromxcode.com

  7. Mantenha-se atualizado •Mudanças no SDK a cada major release •Objective-C

    muda também! • Modern Objective-C • Compatível com iOS anteriores http://clang.llvm.org/docs/ObjectiveCLiterals.html NSArray* arr = @[obj1, obj2, obj3, obj4]; NSLog(@"%@", arr[0]); NSDictionary* dict = @{@"quatro": @4, @"flag": @YES, @"vetor": arr, @"texto" : @"TDC 2012!"}; NSLog(@"%@", dict[@"texto"]); iOS6 - O que vem por aí? 17:40
  8. Ferramentas •TestFlight https://testflightapp.com •CocoaPods http://cocoapods.org •Dev Rocket http://devrocket.uiparade.com

  9. Gerenciamento de memória •Use o ARC! •Cuidado com leaks Gerenciamento

    de memória e ARC 13:10
  10. Threads •Nunca trave a thread principal • I/O, laços demorados...

    •Use Grand Central Dispatch (GCD) ou NSOperationQueue •Atualizações de UI apenas na thread principal
  11. GCD dispatch_async(dispatch_get_global_queue(DISPATCH_QUE UE_PRIORITY_DEFAULT, 0), ^{ // algo demorado... dispatch_async(dispatch_get_main_queue(), ^{

    // atualização de UI view.hidden = NO; }); });
  12. Cuidado com nil •Você pode mandar mensagens pra nil (retornam

    nil) •Vantagem ou desvantagem? •Mais difícil de depurar • Objetos que não foram instanciados NSMutableSet* aSet; // ... [aSet addObject:obj]; // ... [aSet anyObject];
  13. Customização de Inteface •Não use categories •UIAppereance (iOS 5+) •Herança

  14. @implementation UINavigationBar (CustomImage) - (void)drawRect:(CGRect)rect { UIImage *image = [UIImage

    imageNamed: @"NavigationBar.png"]; [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; } @end [[UINavigationBar appearance] setBackgroundImage:img forBarMetrics:UIBarMetricsDefault]; @interface CustomNavigationBar : UINavigationBar @end @implementation CustomNavigationBar -(void) drawRect:(CGRect)rect { UIImage *image = [UIImage imageNamed: @"NavigationBar.png"]; [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; } @end Customização de Inteface
  15. Seja preguiçoso •Não faça nada até que seja necessário •

    Carregar imagens, nibs, instanciar NSDateFormatters • Elementos de tela: apenas quando estiverem visíveis • Scrollviews, tableviews if (! formatter) { formatter = [[NSDateFormatter alloc] init]; formatter.dateStyle = NSDateFormatterMediumStyle; formatter.timeStyle = NSDateFormatterLongStyle; } return formatter;
  16. Reutilize •Instanciar objetos é custoso •Cuidado com NSCalendar, NSDateFormatter •

    Pre ra criar datas a partir de timestamps, e não strings • Cerca de 25x mais rápido (sem contar a inicialização do formatter) •Sempre use o reuseIdenti er em UITableViews •Utilize a ideia em seus componentes de tela
  17. Veri que a performance •Simulador != dispositivo •Static Analyzer •Instruments

    •Não ache. Meça. •Tenha certeza •Otimize •Meça de novo
  18. Recebendo dados remotos •Assincronamente, sempre! •GZIP no servidor •HTTP com

    JSON/XML •Evite ter que tratar estruturas •Balanceie dados remotos e locais •Google App Engine
  19. Desenhando •Nunca chame drawRect: de maneira explicíta •Chame setNeedsDisplay •Declare

    views opacas quando possível •OpenGL ES? GLKit?
  20. Bibliotecas úteis •Alguém já deve ter feito isso... •AFNetworking •JSONKit

    •CorePlot •MBProgressHUD •Reachability •ShareKit •SFHFKeychainUtils •SSToolkit •QuickDialog
  21. None
  22. None