FI MUNI 2012 - iOS Basics

80
iOS Development Lecture 1 - The basics Petr Dvořák Partner & iOS Development Lead @joshis_tweets

Transcript of FI MUNI 2012 - iOS Basics

Page 1: FI MUNI 2012 - iOS Basics

iOS DevelopmentLecture 1 - The basics

Petr Dvo!ákPartner & iOS Development Lead@joshis_tweets

Page 2: FI MUNI 2012 - iOS Basics

Outline

Page 3: FI MUNI 2012 - iOS Basics

Outline• iOS app development ecosystem

• Required hardware

• iOS Developer Account & App Store

• iOS Overview

• XCode and Instruments

• The cool stu" you can do

Page 4: FI MUNI 2012 - iOS Basics

Outline• Objective-C and iOS SDK

• Basic language syntax

• Classes, protocols, categories

• Memory management

Page 5: FI MUNI 2012 - iOS Basics

Outline• UI Elements on iOS

• Overview of the UI building blocks

• Storyboard / Interface Builder

Page 6: FI MUNI 2012 - iOS Basics

Outline• Network aware applications

• Connecting to on-line resources

• Processing XML and JSON

Page 7: FI MUNI 2012 - iOS Basics

iOS Ecosystem

Page 8: FI MUNI 2012 - iOS Basics

Required hardware

• Any computer/laptop with Mac OS X

• Mac Mini - from 13 990 CZK

• MacBook Pro 13” - from 27 990 CZK

Page 9: FI MUNI 2012 - iOS Basics

iOS Developer Account• Bound to Apple ID

• Registration is free

• XCode/SDK download is free

• but it o"ers development for iOS simulator only

Page 10: FI MUNI 2012 - iOS Basics

iOS Developer Account• iOS Developer Program - $99 / year

• Installation on devices

• App Store publishing

• Support

Page 11: FI MUNI 2012 - iOS Basics

Member Center• A dashboard website, a quick pointer

• Dev Centers

• Provisioning Portal

• iTunes Connect

• Resource Center, Developer Support, Forums

Page 12: FI MUNI 2012 - iOS Basics

Developer Center• Separate dev centers for iOS, Mac OS

and Web development

• A place to #nd

• Resources, videos, tutorials, docs, ...

• Early access downloads

Page 13: FI MUNI 2012 - iOS Basics

Provisioning portal• Register your development devices

• max. 100 iOS devices / year

• one-time removal

• Manage certi#cates

• Register AppID

• Create a provisioning pro#le

Page 14: FI MUNI 2012 - iOS Basics

Provisioning pro#le• Development / Distribution pro#les

• A composite entity that contains

• Certi#cates

• AppID

• Devices

Page 15: FI MUNI 2012 - iOS Basics

Provisioning Process

Page 16: FI MUNI 2012 - iOS Basics

iTunes Connect• Manage applications

• Manage legal contracts

• Sales statistics

• Financial Reports, User Management, Contact

Page 17: FI MUNI 2012 - iOS Basics

Member Center• A dashboard that points to

• Dev Centers ~ Learn & Do

• Provisioning Portal ~ Test

• iTunes Connect ~ Distribute

• Resource Center, Developer Support, Forums

Page 18: FI MUNI 2012 - iOS Basics

App Store

Page 19: FI MUNI 2012 - iOS Basics

iOS Overview

Page 20: FI MUNI 2012 - iOS Basics

iOS Overview• Unix based, high performance

• Strict memory management

• Multi-tasking since iOS 4

• Apps are sandboxed

• Speci#c features accessed via public iOS$SDK$APIs

Page 21: FI MUNI 2012 - iOS Basics

Memory management• Application receives memory

warnings from the OS

• Must react on it quickly

• ... free up as much memory as possible as quickly as possible

• ... otherwise, it’s killed

Page 22: FI MUNI 2012 - iOS Basics

Multi-tasking• Application transitions among states

• Not Running

• Inactive

• Active

• Background

• Suspended

Page 23: FI MUNI 2012 - iOS Basics

User’s perspective• Multitasking is

transparent

• “List of last used apps”

• “List of running apps”

• Default.png should resemble the #rst app screen

Page 24: FI MUNI 2012 - iOS Basics

Multi-tasking• Apps may remain alive

• audio

• voip

• location

• newsstand

• external / bluetooth accessory

Page 25: FI MUNI 2012 - iOS Basics

Application sandbox• Every application has a home folder

• Documents folder - is backed up

• Cache folder - isn’t backed up

• tmp folder

Page 26: FI MUNI 2012 - iOS Basics

Development Tools

Page 27: FI MUNI 2012 - iOS Basics

XCode• IDE used for Mac / iOS development

• Tight git VCS integration

• LLVM / GCC compiler

• App Store submit, ad-hoc archives

• Distributed builds

Page 28: FI MUNI 2012 - iOS Basics

XCode - Project/Target

Page 29: FI MUNI 2012 - iOS Basics

XCode - Storyboarding

Page 30: FI MUNI 2012 - iOS Basics

XCode - Source Code

Page 31: FI MUNI 2012 - iOS Basics

Instruments• Set of visual debugging tools

• Memory leaks / Zombie objects

• CPU / Activity monitoring

• Quartz performance

• OpenGL ES performance

Page 32: FI MUNI 2012 - iOS Basics

iPhone/iPad Simulator• Almost like a real device

• Intel instruction set

• Inherits computer CPU and memory

• Limited set of device speci#c features

• no push, no App Store, no phone calls, no accelerometer, ...

Page 33: FI MUNI 2012 - iOS Basics

Advanced demos

Page 34: FI MUNI 2012 - iOS Basics

Advanced demos• Augmented reality

• Qualcom AR SDK for iOS

• https://developer.qualcomm.com/develop/mobile-technologies/augmented-reality

• Face recognition

• OpenCV library built for iOS

• http://opencv.willowgarage.com

Page 35: FI MUNI 2012 - iOS Basics

Augmented reality

Page 36: FI MUNI 2012 - iOS Basics

Face Recognition

Page 37: FI MUNI 2012 - iOS Basics

Objective-C & iOS$SDK

Page 38: FI MUNI 2012 - iOS Basics

Objective-C• Object oriented language

• Derived from C

• It’s not a C++, it’s not even similar

• More similar to SmallTalk

• Dynamic, improved in a rapid pace

Page 39: FI MUNI 2012 - iOS Basics

Confusing parts• Methods are called selectors

• YES/NO instead of TRUE/FALSE

• nil instead of null

• self instead of this

• *.m #les are implementation #les

Page 40: FI MUNI 2012 - iOS Basics

Confusing parts• Map is called NSDictionary

• NSString constant is written as @”aa”

• NS stands for NextStep

• “hello” is a C/C++ string

Page 41: FI MUNI 2012 - iOS Basics

Calling a selector• Java

int a = inst.method(12.0);

MyClass.staticMethod(a, b);

• Objective-Cint a = [inst methodWithParam:12.0];

[MyClass staticMethodWithParam1:a param2:b];

Page 42: FI MUNI 2012 - iOS Basics

Selector• Yes, it is split in multiple parts

• Named parameters improve readability

self.label.textColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];

NSString *imageName = [NSString stringWithFormat:@”image_%d.png”, i];

[[UIImage imageNamed:imgName] stretchableImageWithLeftCapWidth:27 topCapHeight:9];

string = [basePath stringByAppendingPathComponent: @"/some/file.txt"];

Page 43: FI MUNI 2012 - iOS Basics

Declaring a selector• Java

public int method(double number);

private static void staticMethod(int a, bool b);

• Objective-C- (int) methodWithParam:(double)number;

+ (void) staticMethodWithParam1:(int)a param2:(BOOL)b;

// note: avoid “and”, “with”, ... in selector name// WRONG=> initWithName:andSurname:// OK=> initWithName:surname:

Page 44: FI MUNI 2012 - iOS Basics

Declaring a class// Employee.h

#import <Foundation/Foundation.h>

@interface Employee: NSObject <EmployeeProtocol> { NSString _name; // often not necessary}

@property (nonatomic, strong) NSString *name;@property (nonatomic, strong) NSString *surname;

- (id) initWithName:(NSString*)name surname:(NSString*)surname;

@end

Page 45: FI MUNI 2012 - iOS Basics

De#ning a class// Employee.m

#import “Employee.h”

@implementation Employee@synthesize name = _name, surname;

- (id) initWithName:(NSString*)_name surname:(NSString*)_surname { self = [super init]; if (self != nil) { self.name = _name; self.surname = _surname; } return self;}

...

Page 46: FI MUNI 2012 - iOS Basics

De#ning a class...

- (void) greet { NSLog(@”Hello, %@ %@!”, self.name, self.surname);}

@end

Page 47: FI MUNI 2012 - iOS Basics

Declaring a protocol• Protocol ~ Interface

// EmployeeProtocol.h

#import <Foundation/Foundation.h>

@protocol EmployeeProtocol <NSObject>

- (void) greet;

@optional

- (void) greetPolitely;

@end

Page 48: FI MUNI 2012 - iOS Basics

Using a protocol// Employee.h

#import <Foundation/Foundation.h>

@interface Employee: NSObject <EmployeeProtocol> { int someInstanceVariable;}

@property (nonatomic, strong) NSString *name;@property (nonatomic, strong) NSString *surname;

- (id) initWithName:(NSString*)name surname:(NSString*)surname;

Protocol

Page 49: FI MUNI 2012 - iOS Basics

Declaring a category• Category = Extending class without

subclassing

// NSString+Crypto.h

#import <Foundation/Foundation.h>

@interface NSString (Crypto)

- (NSString*) cryptedString;

@end

Page 50: FI MUNI 2012 - iOS Basics

Declaring a category• Category = Extending class without

subclassing

// NSString+Crypto.m

#import "NSString+Crypto.h"

@implementation NSString (Crypto)

- (NSString*) cryptedString { ... }

@end

Page 51: FI MUNI 2012 - iOS Basics

Class Extension• “Category” with nothing in the

brackets

• Usually implemented in the class implementation #le

• Used to implement private properties or to mask read-only modi#er on a property

Page 52: FI MUNI 2012 - iOS Basics

Blocks

• Block = piece of code

• Used throughough the SDK

• ~ Lambda, ~ anonymous

• Blocks are clojures

• __block type speci#er

^

Page 53: FI MUNI 2012 - iOS Basics

Blocks - UI AnimationsimageView.alpha = 0.0;

[UIView animateWithDuration:1.0 animations:^{

imageView.alpha = 1.0;

} completion:^(BOOL finished) { if (finished) { // ... } else { // ... }

}];

Page 54: FI MUNI 2012 - iOS Basics

Blocks - Set #lteringNSSet *iSet = [NSSet set];// ... add objects to the set

[set objectsPassingTest:^(id obj, BOOL *stop) {

return [self testValue:id]; // custom comparison

}];

Page 55: FI MUNI 2012 - iOS Basics

Memory Management

Page 56: FI MUNI 2012 - iOS Basics

Memory management• Every NSObject keeps a reference count

• Object is created => references = 1

• note: created ~ init, new, copy

• Object is retained => references++

• Object is released => references--

• (references == 0) => dealloc

Page 57: FI MUNI 2012 - iOS Basics

Memory management• Before iOS 5: manual memory

management was needed

• retain / release / autorelease

• mechanical, tedious, boring

MyClass inst = [[MyClass alloc] init];// ... do something[inst release];

Page 58: FI MUNI 2012 - iOS Basics

Since iOS 5 - ARC• Automatic Reference Counting is

available

• Occurs during compilation

• Still some libraries without ARC

MyClass inst = [[MyClass alloc] init];// ... do something// object will get released in due course

Page 59: FI MUNI 2012 - iOS Basics

Autorelease pools• Every thread has a stack of

autorelease pools

• Object can register in the pool

• In due course, the pool sends release to the object

• When drained, the pool sends release to the object

• Useful when creating many objects

Page 60: FI MUNI 2012 - iOS Basics

Autorelease pools// HeavyMasacreComputator.m

- (void) doSomething { for (int i = 0; i < TRILLION_TRILLIONS; i++) { for (int j = 0; j < TRILLION; j++) { MyClass c = [[MyClass alloc] init]; // do stuff with my class } }}

Page 61: FI MUNI 2012 - iOS Basics

Autorelease pools// HeavyMasacreComputator.m

- (void) doSomething { for (int i = 0; i < TRILLION_TRILLIONS; i++) { @autoreleasepool { for (int j = 0; j < TRILLION; j++) { MyClass c = [[MyClass alloc] init]; // do stuff with my class } } }}

Page 62: FI MUNI 2012 - iOS Basics

Autorelease pools// HeavyMasacreComputator.m - pre iOS 5

- (void) doSomething { for (int i = 0; i < TRILLION_TRILLIONS; i++) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; for (int j = 0; j < TRILLION; j++) { MyClass c = [[[MyClass alloc] init] autorelease]; // do stuff with my class } [pool drain]; }}

Page 63: FI MUNI 2012 - iOS Basics

Ownership Quali#ers• How objects are assigned

• __strong - retained

• __unsafe_unretained - not retained

• __weak - dtto, set to nil on dealloc

• __autoreleasing - retained, autoreleased

Page 64: FI MUNI 2012 - iOS Basics

Properties• Getter / Setter for the instance

variables

• “Dot notation” for access

• Flags in the header #le

• Synthesized in the implementation #le

• Read-only / read-write properties

Page 65: FI MUNI 2012 - iOS Basics

Properties• Property vs. iVar

• self.name ~ getter / setter used

• [self name];

• [self setName:@”Petr”];

• name ~ direct access to iVar

• name = @”hello”;

Page 66: FI MUNI 2012 - iOS Basics

Properties• Implied ownership quali#ers for iVar

• strong, retain, copy => __strong

• weak => __weak

• assign, unsafe_unretained => __unsafe_unretained

Page 67: FI MUNI 2012 - iOS Basics

UI Elements

Page 68: FI MUNI 2012 - iOS Basics

UIKit - The Gist• Framework for iOS UI

• UI Components, gesture recognizers

• MVC approach

• UIViewController manages UIView

• UIViewController references model

Page 69: FI MUNI 2012 - iOS Basics

UIKit - MVC diagram

Model

Page 70: FI MUNI 2012 - iOS Basics

UI Consistency• Controls and views are customizable

• iOS is a very consistent platform, less is often more

• Follow iOS Human Interface Guidelines

Page 71: FI MUNI 2012 - iOS Basics

iOS UI - Tools• Storyboard / Interface Builder

• Hints in code for actions/outlets

• IBAction

• IBOutlet

• “Segue” since iOS 5

• View transitions for free

Page 72: FI MUNI 2012 - iOS Basics

Network Aware Apps

Page 73: FI MUNI 2012 - iOS Basics

Networking• Three classes to make it work

• [NSURL URLWithString:@”http://google.com”];

• [NSURLRequest requestWithUrl:url];

• [NSURLConnection connectionWithRequest:request delegate:self]

???

Page 74: FI MUNI 2012 - iOS Basics

Delegate• Similar to observer pattern

• “Only one instance of observer”

• An object that receives callbacks

• Uses protocol to de#ne the callbacks

• Musn’t be retained to avoid retain cycles => “weak”

Page 75: FI MUNI 2012 - iOS Basics

DataSource• Structure is the same as for the

delegate

• not retained

• bound by a protocol

• Callbacks are used to feed data to a$view

Page 76: FI MUNI 2012 - iOS Basics

Connection callbacks// NSURLConnectionDataDelegate formal protocol since iOS 5

// HTTP response

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

// Data chunk received

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;

// All done

- (void) connectionDidFinishLoading:(NSURLConnection *)conn;

// Problem with connection

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;

Page 77: FI MUNI 2012 - iOS Basics

Processing JSON• JSON-Framework

• New BSD Licence

• JSON parser and generator

• http://stig.github.com/json-framework/

Page 78: FI MUNI 2012 - iOS Basics

Processing XML• TouchXML

• Modi#ed BSD Licence

• DOM parser + XPath, XML Namespaces

• https://github.com/TouchCode/TouchXML

Page 80: FI MUNI 2012 - iOS Basics

Thank youhttp://www.inmite.eu/talks

Petr Dvo!ákPartner & iOS Development Lead@joshis_tweets