Share
Embed
Minicurso de iOS @ Mobile Day
Minicurso de 4h de introdução à programação para iOS, no Mobile Day, na UFBA.
rodrigorgs
January 24, 2014
Transcript
74 slides
-
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–) -
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? -
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 -
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! -
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/ -
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/ -
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 -
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 -
Linguagem • Objective-C • Criada em 1980 • Popularizada a
partir de 1988, com o sistema operacional NeXTSTEP • Superconjunto de C • Orientada a objetos -
Frameworks • Cocoa Touch • Media (áudio, gráficos) • Core
Services (rede, sqlite, localização, threads…) • Core OS / iOS kernel (sockets, arquivos…) -
IDE • Xcode • Interface Builder • iOS Simulator •
Depurador, analisador sintático, detector de vazamento de memória etc. -
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 -
Estrutura do Projeto ponto de! entrada do! programa desenho! das
telas código da! tela inicial -
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 -
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 -
View • Componentes de interface (label, botão etc.) • Combinação
de views • Três formas • Arquivo .storyboard • Arquivo .xib • Código Objective-C -
• Classe AloViewController • Atualiza o model e a view
• Responde a eventos do usuário Controller -
Classes • Classe = dados + comportamento • atributos e
métodos • Classe = interface + implementação • arquivos .h (header) e .m (module) -
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 -
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) -
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 -
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 +) -
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: -
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 -
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 -
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) -
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 -
Outlets @interface AloViewController () ! @property (weak, nonatomic) IBOutlet UILabel
*label; ! @end Outlet: referência para um elemento do storyboard -
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:…]; -
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 -
Acessando propriedade - (void)viewDidLoad { [super viewDidLoad]; self.label.text = @"Alo
Mundo!!!"; // ou [self.label setText:@"Alo Mundo!!!"]; } -
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 -
Foundation • Vamos iniciar um projeto de linha de comando
para brincar com o Foundation. -
Foundation • NSString, NSArray, NSDictionary • @"…" @[a, b, …]
@{chave: valor, …} • NSMutableString, NSMutableArray, … -
NSArray • [array objectAtIndex:3]; • for (NSString *s in array)
{ … } • NSMutableArray: • [array addObject:…]; • [array removeObject:…]; -
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. -
MVC Model View Controller NSMutableArray UIView definida em! Main.storyboard,! contendo
UIButton,! UITextView etc. AloViewController atualiza atualiza -
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 -
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 -
Antes de implementar, testes @interface ListaTarefasTest : XCTestCase ! -
(void)testLimpaItens - (void)testAdicionaItem - (void)testDescription ! -
Adiciona persistência NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults]; ! ! NSArray
*array = [prefs objectForKey:…]; ! ! [prefs setObject:… forKey:…]; lê configuração escreve configuração -
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; } -
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; } -
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 -
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.