beginningi os part1-bobmccune
DESCRIPTION
Mobile March 2012TRANSCRIPT
http://bobmccune.com
Beginning iOS Development
Monday, March 19, 12
Beginning iOS DevelopmentAgenda
• Understanding the Tools
• Objective-C Crash Course
• Using Cocoa Touch
Monday, March 19, 12
iOS SDK Tools
Monday, March 19, 12
Xcode
Monday, March 19, 12
Xcode•Apple’s IDE for creating Mac and iOS apps
•Provides visual front end to LLVM and LLDB
•Hub of development process:
Editing
Building
Refactoring
Debugging
API Doc Integration
UI Design
Testing
Model Design
Deployment
Project Configuration
Monday, March 19, 12
iOS Simulator
Monday, March 19, 12
•Device simulator, runs on your desktop
•Both iPhone and iPad (retina, non-retina)
•Faster code, build, test cycle
•Test behaviors: rotation, shake, multi-touch
•Easier testing of exceptional conditions
• iOS Simulator != iOS Device:
•No memory or CPU limits
•Not all APIs and capabilities available
iOS Simulator
Monday, March 19, 12
Instruments
Monday, March 19, 12
Instruments
• Dynamic tracing and profiling tool• Uses digital audio workstation-like interface• Large library of standard instruments
• Core Animation, Leaks, Automation, etc.
• The ultra geeky can build custom instruments
Monday, March 19, 12
Hands-On Tour
Monday, March 19, 12
Objective-C
Monday, March 19, 12
Objective-C EssentialsAgenda
• Overview of Objective-C
• Understanding Classes and Objects
• Methods, Messages, and Properties
• Protocols
Monday, March 19, 12
The old, new hotnessObjective-C
• Strict superset of ANSI C• Object-oriented extensions
• Additional syntax and types
• Dynamic, Object-Oriented Language:• Dynamic Typing
• Dynamic Binding
• Dynamic Loading
Monday, March 19, 12
Creating Classes
Monday, March 19, 12
The BlueprintCreating Classes
• Objective-C classes are separated into an interface and an implementation.• Usually defined in separate .h and .m files
•Defines the programming interface
•Can define object instance variables
•Defines the actual implementation code
•Implement one or more initializers to properly initialize an object instance
Monday, March 19, 12
Defining the Interface@interface BankAccount : NSObject {}
@end
float accountBalance;NSString *accountNumber;
- (float)withDraw:(float)amount;- (void)deposit:(float)amount;
Monday, March 19, 12
Defining the Interface@interface BankAccount : NSObject {}
@end
float accountBalance;NSString *accountNumber;
- (float)withDraw:(float)amount;- (void)deposit:(float)amount;
Monday, March 19, 12
Defining the Interface@interface BankAccount : NSObject {}
@end
float accountBalance;NSString *accountNumber;
- (float)withDraw:(float)amount;- (void)deposit:(float)amount;
Monday, March 19, 12
Defining the Interface@interface BankAccount : NSObject {}
@end
float accountBalance;NSString *accountNumber;
- (float)withDraw:(float)amount;- (void)deposit:(float)amount;
Monday, March 19, 12
Defining the Interface@interface BankAccount : NSObject {}
@end
float accountBalance;NSString *accountNumber;
- (float)withDraw:(float)amount;- (void)deposit:(float)amount;
Monday, March 19, 12
Defining the Interface@interface BankAccount : NSObject {}
@end
float accountBalance;NSString *accountNumber;
- (float)withDraw:(float)amount;- (void)deposit:(float)amount;
Monday, March 19, 12
Defining the Implementation#import "BankAccount.h"
@implementation BankAccount
- (id)init { self = [super init]; return self;}
- (float)withdraw:(float)amount { // calculate valid withdrawal return amount;}
- (void)deposit:(float)amount { // record transaction}@end
Monday, March 19, 12
Defining the Implementation#import "BankAccount.h"
@implementation BankAccount
- (id)init { self = [super init]; return self;}
- (float)withdraw:(float)amount { // calculate valid withdrawal return amount;}
- (void)deposit:(float)amount { // record transaction}@end
Monday, March 19, 12
Defining the Implementation#import "BankAccount.h"
@implementation BankAccount
- (id)init { self = [super init]; return self;}
- (float)withdraw:(float)amount { // calculate valid withdrawal return amount;}
- (void)deposit:(float)amount { // record transaction}@end
Monday, March 19, 12
Defining the Implementation#import "BankAccount.h"
@implementation BankAccount
- (id)init { self = [super init]; return self;}
- (float)withdraw:(float)amount { // calculate valid withdrawal return amount;}
- (void)deposit:(float)amount { // record transaction}@end
Monday, March 19, 12
Understanding the SyntaxDefining Methods
• Class methods
• Prefixed with a +
• Tied to class, not instance
• Instance Methods• Instance methods prefix with a -
• Modifies state of an object instance
- (NSString *)description;
Monday, March 19, 12
Understanding the SyntaxDefining Methods
• Class methods
• Prefixed with a +
• Tied to class, not instance
• Instance Methods• Instance methods prefix with a -
• Modifies state of an object instance
- (BOOL)respondsToSelector:(SEL)aSelector;
Monday, March 19, 12
Understanding the SyntaxDefining Methods
• Class methods
• Prefixed with a +
• Tied to class, not instance
• Instance Methods• Instance methods prefix with a -
• Modifies state of an object instance
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;
Monday, March 19, 12
Talking to yourself
-(id)init { self = [super init]; if (self) { // do initialization } return self;}
• Methods have implicit reference to owning object called self
• Additionally have access to superclass methods using super
self and super
Monday, March 19, 12
Working with Objects
Monday, March 19, 12
Two-Stage Creation• NSObject defines class method called alloc
• Dynamically allocates memory for object
• Returns new instance of receiving class
BankAccount *account = [BankAccount alloc];
• NSObject defines instance method init
• Implemented by subclasses to initialize instance after memory for it has been allocated
• Subclasses commonly define several initializers
• alloc and init calls should always nested into single line
account = [account init];
BankAccount *account = [[BankAccount alloc] init];
Monday, March 19, 12
Messages
• Methods are invoked by passing messages• Methods are never directly invoked
• Messages dynamically bound to method implementations at runtime
• Simple messages take the form:• [object message];
• Can pass one or more arguments:• [object methodWithArg1:arg1 arg2:arg2];
Communicating with Objects
Monday, March 19, 12
Messaging an ObjectNSMutableDictionary *person =
[NSMutableDictionary dictionary];
[person setObject:children forKey:@"children"];
[person setObject:@"Joe Smith" forKey:@"name"];
NSString *address = @"123 Street";NSString *house = [address substringWithRange:NSMakeRange(0, 3)];[person setObject:house forKey:@"houseNumber"];
NSArray *children = [NSArray arrayWithObjects:@"Jack", @"Susie", nil];
Monday, March 19, 12
Declared Properties
Monday, March 19, 12
Declared Properties
• Most common methods we write are accessors
• Objective-C can automatically generate accessors
• Much less verbose, less error prone
• Highly configurable
• Declared properties are defined in two parts:
• @property definition in the interface
• @synthesize statement in the implementation
Simplifying Accessors
Monday, March 19, 12
Declaring Properties
Attribute Impacts
nonatomic Concurrency
readonly/readwrite Mutability
strong/copy/weak/assign Storage
getter/setter API
@property (attributes) type variable;
Monday, March 19, 12
Declaring Properties
Attribute Impacts
nonatomic Concurrency
readonly/readwrite Mutability
strong/copy/weak/assign Storage
getter/setter API
@property (attributes) type variable;
@property (readonly) BOOL active;
Monday, March 19, 12
Declaring Properties
Attribute Impacts
nonatomic Concurrency
readonly/readwrite Mutability
strong/copy/weak/assign Storage
getter/setter API
@property (attributes) type variable;
@property (nonatomic, readonly) BOOL active;
Monday, March 19, 12
Declaring Properties
Attribute Impacts
nonatomic Concurrency
readonly/readwrite Mutability
strong/copy/weak/assign Storage
getter/setter API
@property (attributes) type variable;
@property (nonatomic, strong) NSDate *activeDate;
Monday, March 19, 12
Declaring Properties
Attribute Impacts
nonatomic Concurrency
readonly/readwrite Mutability
strong/copy/weak/assign Storage
getter/setter API
@property (attributes) type variable;
@property (readonly, getter=isValid) BOOL valid;
Monday, March 19, 12
Defining the InterfaceDeclaring Properties
@interface BankAccount : NSObject
@property (nonatomic, copy) NSString *accountNumber;@property (nonatomic, strong) NSDecimalNumber *balance;@property (readonly, strong) NSDecimalNumber *fees;@property (getter=isCurrent) BOOL accountCurrent;
@end
Monday, March 19, 12
Generating the AccessorsSynthesizing Properties
@implementation BankAccount
@synthesize accountNumber = _accountNumber;@synthesize balance = _balance;@synthesize fees = _fees;@synthesize accountCurrent = _accountCurrent;
@end
Monday, March 19, 12
Accessing Properties• Generated properties are standard methods
• Accessed through normal messaging syntax
[object property];[object setProperty:newValue];
• Objective-C property access via dot notationobject.property;object.property = newValue;
Dot notation is just syntactic sugar. Still uses accessor methods. Doesn't get/set values directly.
Monday, March 19, 12
Protocols
Monday, March 19, 12
Object-Oriented ContractsProtocols
• Abstract methods to be implemented• Methods are not tied to a specific class
• Analogous to C# and Java interfaces
• Useful in defining:• Capturing similarities among classes that aren't
hierarchically related
• Declaring an interface while hiding its particular class
• Delegate callback methods
Monday, March 19, 12
NSCodingDefining a Protocol
@protocol NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder;- (id)initWithCoder:(NSCoder *)aDecoder;
@end
* NSCoding defined in Foundation Framework
Monday, March 19, 12
Conforming to the ContractAdopting a Protocol
@interface User : NSObject <NSCoding>
@property (nonatomic, copy) NSString *username;@property (nonatomic, copy) NSString *password;
@end
Monday, March 19, 12
Conforming to the ContractAdopting a Protocol
@interface User : NSObject <NSCoding>
@property (nonatomic, copy) NSString *username;@property (nonatomic, copy) NSString *password;
@end
Monday, March 19, 12
Conforming to the ContractAdopting a Protocol
@implementation User
-(id)initWithCoder:(NSCoder *)coder { if (self = [super init]) { self.username = [coder decodeObjectForKey:@"username"]; self.password = [coder decodeObjectForKey:@"password"]; } return self;}
-(void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:self.username forKey:@"username"]; [coder encodeObject:self.username forKey:@"password"];}
@end
Monday, March 19, 12
Time to Code!
Monday, March 19, 12
Using Cocoa Touch
Monday, March 19, 12
Cocoa Touch
• Core framework for non-UI functionality
• Operating System Classes• threading, archiving, filesystem
• Collections• Common collection types: arrays, dictionaries, sets
• Networking support
• XML Processing
Foundation Framework
Monday, March 19, 12
Cocoa Touch
• Framework for building iOS user interfaces
• User Interface Elements
• Tables, buttons, images, etc.
• Views and View Controllers
• Multitouch Event Handling
• High-level Drawing Routines
UIKit Framework
Monday, March 19, 12
Model, View, ControllerUnderstanding MVC
Model View
Controller
Monday, March 19, 12
The “V” in MVC
• Base class for iOS user interface components• Drawing and animation
• Layout and subview management
• Multitouch event handling
• Xcode’s Interface Builder used to build UI• Archived version of UI stored in XIB/NIB file
• Dynamically loaded at runtime by controller
• Can be created programmatically
UIView
Monday, March 19, 12
The “C” in MVC
• The heart of every iOS app
• Provides the “glue code” between the model and view
• Responsible for managing the view hierarchy and lifecycle
• Key view lifecycle methods:
UIViewController
- (void)loadView;- (void)viewDidLoad;- (void)viewDidUnload;
Monday, March 19, 12
Is view nil?
controller.view
View Controller
View loadView viewDidLoad
1) Overridden2) Loaded from NIB3) Return empty UIView
UIViewController: View Loading
Monday, March 19, 12
View Unloading
• didReceiveMemoryWarning• Called by OS when low memory encountered
• If possible, will release controller’s view
• Can override, but must call super
• viewDidUnload invoked if root view released• Override to release anything that can be
recreated in loadView/viewDidLoad
Dealing with low memory conditions
Monday, March 19, 12
Display-related Callbacks
viewWillAppear• Called immediately prior to being presented
viewDidAppear• Called upon view being added to window
viewWillDisappear• Called immediately before view is removed
from window or is covered by another viewviewDidDisappear
• Called after view is removed from window or is covered by another view
Monday, March 19, 12
Wiring the View and View ControllerOutlets and Actions
• Provides metadata to Interface Builder to allow connections between objects
• IBOutlet
• Property reference to XIB/NIB objects
• Null-defined C macro
• IBAction
• Used by Interface Builder to determine available actions
• Void-defined C macro
Monday, March 19, 12
Time to Code!
Monday, March 19, 12