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

Minicurso de iOS @ Mobile Day

rodrigorgs
January 24, 2014

Minicurso de iOS @ Mobile Day

Minicurso de 4h de introdução à programação para iOS, no Mobile Day, na UFBA.

rodrigorgs

January 24, 2014
Tweet

More Decks by rodrigorgs

Other Decks in Programming

Transcript

  1. Quem sou eu • Fundador da RoDen Apps (2009–) •

    Doutorando em Ciência da Computação na UFBA (2009–) • Analista de TI na STI-UFBA (2012–)
  2. Quem são vocês • Experiência com Objective-C? • Experiência com

    C? • Experiência com iOS? • Experiência com outras plataformas móveis? • Experiência com Mac OS X?
  3. Conteúdo • Conceitos • Xcode • Classes e MVC •

    Propriedades, outlets e actions • Foundation framework • Storyboards • Table View Controller • Navigation View Controller • User Preferences • Requisições HTTP • JSON • Testes de unidade
  4. Não-conteúdo • Diversos recursos da linguagem 
 (protocol, selector, blocks

    etc.) • Interface adaptada ao iPad ou a várias orientações • Core Data • Threads • Diferenças entre versões do iOS • Nada será aprofundado!
  5. iOS

  6. App Store • Loja de aplicativos, 2008 • Licença de

    desenvolvedor: US$ 99 por ano • Mais de 1 milhão de aplicativos • Mais de 60 bilhões de downloads https://developer.apple.com/programs/which-program/
  7. Dispositivos • iPhone e iPod touch (320x480, 640x960, 640, 1136)

    • iPad e iPad mini (1024x768, 2048x1536) • Tela sensível ao toque, câmera, telefonia, Wi-Fi, bluetooth, acelerômetro, giroscópio, bússola, GPS… http://www.iosres.com/
  8. Sistema Operacional • Derivado do OS X • Anunciado em

    janeiro de 2007, com o iPhone • iPhone OS (2008), iOS (2010) • Atualizado anualmente • iOS 7: lançado em setembro de 2013
  9. Sistema Operacional • Cada app roda em uma sandbox, não

    tem acesso arquivos ou memória externa • OpenGL ES, aceleração gráfica • Não há paginação de memória para disco • Seu app é notificado quando há pouca memória • Não há garbage collection
  10. Linguagem • Objective-C • Criada em 1980 • Popularizada a

    partir de 1988, com o sistema operacional NeXTSTEP • Superconjunto de C • Orientada a objetos
  11. Frameworks • Cocoa Touch • Media (áudio, gráficos) • Core

    Services (rede, sqlite, localização, threads…) • Core OS / iOS kernel (sockets, arquivos…)
  12. IDE • Xcode • Interface Builder • iOS Simulator •

    Depurador, analisador sintático, detector de vazamento de memória etc.
  13. IDE

  14. IDE

  15. Para aprender mais • Curso CS193p da Stanford:
 Developing iOS

    7 Apps for iPhone and iPad • Ray Wenderlich Tutorials for iPhone / iOS Developers and Gamers: http://www.raywenderlich.com/ • Diversos materiais na Internet
  16. MVC

  17. Model View Controller representação de! um domínio, 
 dados e

    comportamento representação! visual do model conecta! model e! view atualiza atualiza notifica notifica
  18. Model • Números, strings, listas etc. • Objetos complexos •

    App AloMundo: não há nenhum modelo explícito nome de uma pessoa: string! idade de uma pessoa: int! uma pessoa: objeto complexo
  19. View • Componentes de interface (label, botão etc.) • Combinação

    de views • Três formas • Arquivo .storyboard • Arquivo .xib • Código Objective-C
  20. • Classe AloViewController • Atualiza o model e a view

    • Responde a eventos do usuário Controller
  21. Classes • Classe = dados + comportamento • atributos e

    métodos • Classe = interface + implementação • arquivos .h (header) e .m (module)
  22. Classes • Arquivo .h (interface) • Declaração de métodos e

    atributos públicos (que outras classes podem acessar) • Arquivo .m (implementação) • Definição de métodos públicos e privados • Atributos privados
  23. Arquivo .h #import <UIKit/UIKit.h> ! @interface AloViewController : UIViewController !

    @end interface pública superclasse arquivo onde está declarada a classe UIViewController! arquivo da SDK Todo arquivo que referencia AloViewController deve #importar
 o arquivo AloViewController.h (ou um arquivo que #importe ele)
  24. Arquivo .m #import "AloViewController.h" ! @interface AloViewController () ! @end

    ! @implementation AloViewController ! ! ! ! ! ! ! ! ! ! ! ! ! @end arquivo do seu projeto onde está declarada a classe AloViewController interface privada implementação
  25. Arquivo .m #import "AloViewController.h" ! @interface AloViewController () ! @end

    ! @implementation AloViewController ! - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view,
 // typically from a nib. } ! - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be // recreated. } ! @end definição do método viewDidLoad chamada ao método da superclasse tipo do retorno método de! instância! (se for estático,! troca por +)
  26. Métodos @interface Teste : NSObject ! - (void)dizAlo; - (int)quadradoDe:(int)numero;

    - (int)produtoDe:(int)x por:(int)y; ! @end Em C/Java, seria int produto(int x, int y) Nome do método: produtoDe:por:
  27. Métodos @implementation Teste ! - (void)dizAlo { NSLog(@"Alo"); } !

    - (int)quadradoDe:(int)numero { return numero * numero; } ! - (int)produtoDe:(int)x por:(int)y { return x * y; } ! @end
  28. Chamada de Método (Mensagem) Teste *calc = [[Teste alloc] init];

    [calc dizAlo]; int a = [calc quadradoDe:3]; int b = [calc produtoDe:2 por:3]); ! calc = nil; chama o método init no resultado de [Teste alloc] alloc aloca a memória! init é o construtor
  29. Ponteiros • Referências a objetos são ponteiros; usa-se o asterisco

    (*) para denotar isso. Ex.: UIView *, Teste * • Objetos são alocados dinamicamente • Referência nula: nil • Tipos primitivos: int, NSUInteger… (sem asterisco)
  30. Commit • Source Control > Commit • Você pode ver

    o que foi alterado desde o último commit • Se fizer besteira no código, é fácil voltar para o estado anterior • Você pode olhar o histórico completo de mudanças e ver como implementou cada funcionalidade
  31. Outlets @interface AloViewController () ! @property (weak, nonatomic) IBOutlet UILabel

    *label; ! @end Outlet: referência para um elemento do storyboard
  32. Propriedades @property (weak, nonatomic) IBOutlet UILabel *label; Equivalente a declarar

    dois métodos:! - (void)setLabel:(UILabel *)label; - (UILabel *)label; getter setter De bônus, você pode usar a dot notation:! … = obj.label; obj.label = …; equivale a … = [obj label]; equivale a [obj setLabel:…];
  33. Gerenciamento de memória • Contagem automática de referências (ARC) •

    Ponteiros strong e weak • Quando não houver nenhum ponteiro strong para um objeto, ele é desalocado • Se você quer garantir que o objeto não será desalocado, crie um ponteiro strong para ele • Quando um objeto é desalocado, todas os ponteiros weak são atualizados para nil. • Evita ponteiros para objetos desalocados
  34. Acessando propriedade - (void)viewDidLoad { [super viewDidLoad]; self.label.text = @"Alo

    Mundo!!!"; // ou [self.label setText:@"Alo Mundo!!!"]; }
  35. IBAction • IBAction: método que está associado a um evento

    de um elemento de um storyboard. • Cria um IBAction • Coloca um NSLog pra saber que está sendo chamado • Ou então coloca um breakpoint
  36. Foundation • NSString, NSArray, NSDictionary • @"…" @[a, b, …]

    @{chave: valor, …} • NSMutableString, NSMutableArray, …
  37. NSArray • [array objectAtIndex:3]; • for (NSString *s in array)

    { … } • NSMutableArray: • [array addObject:…]; • [array removeObject:…];
  38. Lista de tarefas • Monta interface com UITextField, UIButton e

    UITextView, uma tarefa por linha do UITextView • Atualiza tela a partir de elementos em um NSArray fixo • Permite adicionar itens através do botão • Refatora: cria classe ListaTarefas, implementando testes antes. • Adiciona persistência com NSUserDefaults; adiciona teste antes • Por fim: table; depois nav; então web.
  39. MVC Model View Controller NSMutableArray UIView definida em! Main.storyboard,! contendo

    UIButton,! UITextView etc. AloViewController atualiza atualiza
  40. Refatoração Model View Controller Classe ListaTarefas, 
 que contém um

    ! NSArray de NSString UIView definida em! Main.storyboard,! contendo UIButton,! UITextView etc. AloViewController atualiza atualiza
  41. Refatora: cria classe ListaTarefas #import <Foundation/Foundation.h> ! @interface ListaTarefas :

    NSObject ! - (void)adicionaItem:(NSString *)item; - (void)limpaItens; - (NSString *)description; ! @property (strong, nonatomic) NSArray *itens; ! @end
  42. Antes de implementar, testes @interface ListaTarefasTest : XCTestCase ! -

    (void)testLimpaItens - (void)testAdicionaItem - (void)testDescription !
  43. Adiciona persistência NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; ! ! NSArray

    *array = [prefs objectForKey:…]; ! ! [prefs setObject:… forKey:…]; lê configuração escreve configuração
  44. Troca texto por table view - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { …

    } ! - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { … } ! - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; … return cell; }
  45. Usa navigation controller - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UITableViewCell *cell

    = (UITableViewCell *)sender; NSString *item = cell.textLabel.text; … *detailVC = segue.destinationViewController; detailVC.item = item; }
  46. Bônus: remove item • Cria protocol • Primeiro view controller

    se define como delegate do segundo • Segundo envia mensagem quando usuário pressionar botão de remoção
  47. Limitações • Mude a orientação do iOS Simulator ou altere

    o dispositivo para iPad. A interface não se adapta. • A interface congela enquanto baixa tarefas. • A lista de tarefas é toda carregada na memória; a cada mudança, é preciso escrever toda a lista em disco.