OVERVIEW - Josh Smith on WPF · OVERVIEW Why learn iOS programming? ... •Working in native iOS...
Transcript of OVERVIEW - Josh Smith on WPF · OVERVIEW Why learn iOS programming? ... •Working in native iOS...
OVERVIEW
Why learn iOS programming?Share first-hand experience.Identify platform differences.Identify similarities with .NET
•Microsoft MVP for 4 years
•C#, WinForms, WPF, Silverlight
• Joined Cynergy about 2 years ago
•Working in native iOS ever since
•iJoshSmith.com (my iOS blog)
MY BOOK
iOS Programming for .NET DevelopersiosForDotNetDevs.comPaperback, iBooks, Kindle, Nook
WHY MOBILE?
Huge demand for mobile devs
Large budgets for mobile projects
Lots of greenfield dev work! :-)
WHY IOS?
Not the only choice, but a good one
Many mobile projects focus on iOS
Perceived difficulty == Mo’ Money
IOS APP PLATFORMS
Xamarin/MonoTouch - C#
PhoneGap - HTML/JavaScript
Native - Objective-C
MY FIRST REAL IOS PROJECT
TRANE MAP
For HVAC salespeopleSelect systems to sell
Present systems to homeownerCreate and sign proposal on iPad
Generate PDF proposal document
VIDEO
Trane MAP via Cynergy.com
LESSONS LEARNED
Mobile apps are a different breedMobile form factor matters
Apps can (easily) run out of memoryNaming conventions are important
Core Data is terrificBe careful re: data model versioning
NOT IN KANSAS ANYMOREWindows OS X
Visual Studio Xcode
C# or VB.NET Objective-C
Garbage Collection Reference Counting
.NET Runtime Objective-C Runtime
Base Class Library Foundation
WPF or SL or WinForms UIKit
TOUR DE XCODELet’s take a guided tour of Apple’s IDE...
OBJECTIVE-C != C#
OBJECTIVE-C
Superset of C
Object orientation a la Smalltalk
Obj-C Runtime supports OO
POINTERS 101
Pointer is 8 bytes of memory
Stores a memory address
Not guaranteed to be valid
POINTERS EXAMPLE
int *pointerToInt = NULL;int someInt = 42;// Assign the pointer the address of someInt.
pointerToInt = &someInt;// Dereference the pointer and assign it a value.
*pointerToInt = 101;assert(someInt == 101);
NIL / NULL
nil - for pointer to Obj-C objectNULL - for pointer to C valueNSNull - similar to .NET DBNullNil - for pointer to a Class object
NIL HANDLING
nil is false and non-nil is trueif (aPointer != nil)...is equivalent to...if (aPointer)
CALLING A METHOD
Obj-C “message passing”[anObject someMethod];C#anObject.SomeMethod();
MESSAGE TO NIL
Messages sent to nil are ignored
Evaluates to default of return type (0)
Edge cases if method returns C struct
PASSING AN ARGUMENT
Obj-C[dev learnSkill:@”iOS”];C#dev.LearnSkill(”iOS”);
PASSING ARGUMENTS
Obj-C[obj setOffset:42 animated:YES];C#obj.SetOffset(42, true);
CREATING AN OBJECT
Obj-CJASFoo *f = [[JASFoo alloc] init];JASFoo *f = [JASFoo new];
C#Foo f = new Foo();
.H & .M FILES
Classes are split between two files
Header (.h) - declarations
Implementation (.m) - definitions
CLASS DECLARATION
Obj-C (in .h file)@interface JASFoo : NSObject- (BOOL)hello;@end
C# does not have an equivalent
CLASS DEFINITIONObj-C (in .m file)@implementation JASFoo { NSString *_anIvar;}- (BOOL)hello { return NO; } @endC# (in .cs file)public class Foo { private string _aField; public bool Hello() { return false; }}
METHODS
Declared in .h file (optional)Defined in .m file
Class methods prefixed with +Instance methods prefixed with -
CLASS METHODS
Similar to static methods in .NETCan be overridden by subclasses!!!Template:+ (return_type)methodName:(arg_type)argName
Example:+ (JASFoo *)fooWithURL:(NSURL *)url;
INSTANCE METHODS
Template:- (return_type)methodName:(arg_type)argName
Example:- (int)indexOfObject:(id)anObject;
PROPERTIES
Declared in .h@property (nonatomic, copy) NSString *name;
Synthesized by compilerCustom accessor methods in .mExample usage:obj.name = @”Arthur Dent”;
THE SELF POINTER
Similar to ‘this’ in C#
Points to object in instance methods
Points to a Class in class methods
THE SELF POINTER
Obj-Cfloat f = [self instanceMethod];double d = self->_anIvar;
C#float f = this.InstanceMethod();double d = this.aField;
OBJECT INITIALIZERLike a constructor in .NET- (id)init { self = [super init]; if (self) { // Assign initial values. _anIvar = 42; } return self;}
DEALLOC
Called before an object is killed- (void)dealloc { [_anIvar cleanUp]; // Only if ARC disabled... [super dealloc];}
MEMORY MANAGEMENT
MEMORY MANAGEMENT
No Garbage Collector
Reference/Retain Counting
Automatic Reference Counting (ARC)
OBJECT OWNERSHIP
Objects live while owned
Owned == Retained
An owner retains an object
OBJECT OWNERSHIP
Deallocated when retain count is 0
Deallocated immediately by runtime
Pointer to dead object is “dangling”
NSOBJECT +ALLOC
+alloc
Allocates new object
Initial retain count of 1
NSOBJECT -RETAIN
-retain method
Increments receiver’s retain count
NSOBJECT -RELEASE
-release method
Decrements receiver’s retain count
If retain count reaches 0 object dies
NSOBJECT -AUTORELEASE
-autorelease method
Delayed decrement of retain count
Used when returning a new object
NSOBJECT -DEALLOC
-dealloc method
Relinquish ownership of objects
Invoked when retain count is 0
EXAMPLEFoo *f = [[Foo alloc] init];// f’s retain count is 1[f doSomethingAwesome];[f release];// f’s retain count is 0// f’s -dealloc executesf = nil;// Assign nil to avoid dangling pointer
ARC
Compiler feature
Adds memory mgmt to your code
Introduced in iOS 5
EXAMPLE WITH ARC
Foo *f = [[Foo alloc] init];[f doSomethingAwesome];
FOUNDATION VS. BCL
OBJECT VS. NSOBJECT
STRING VS. NSSTRING
STRINGBUILDER VS. NSMUTABLESTRING
DATETIME VS. NSDATE
ARRAY VS. NSARRAY
HASHTABLE VS. NSMUTABLEDICTIONARY
UIKIT
UIKIT
High-level user interface API
Provides the “iOS look & feel”
Based on MVC pattern
DRAWING SYSTEMS
VIEWS
UIView is the basic UI object
Views can contain subviews
Views are contained by a superview
UIVIEW SUBCLASSES
UIButtonUILabelUITextFieldUIImageViewUITableView
VIEW CONTROLLERS
Manage a set of Views
Container controller (manages controllers)
Content controller (displays stuff)
CONTAINER CONTROLLERS
UINavigationControllerUITabBarControllerUIPageViewControllerUISplitViewController (iPad only)
CONTENT CONTROLLERS
UITableViewController subclasses
Your UIViewController subclasses
MODAL PRESENTATION
Controllers can be ‘presented’
Presented controllers are ‘modal’
Modal controllers are ‘dismissed’
PRESENTATION EXAMPLE
XIB FILE
Contains a View
XML data
Edited via Interface Builder
STORYBOARD FILE
Contains multiple Views (“scenes”)
Defines navigation paths (“segues”)
Edited via Interface Builder
OUTLETS
A property or ivar on a Controller
Assigned a View pointer automatically
Hooked up in Interface Builder
ACTIONS
UI event handling methods
Defined in Controller classes
Hooked up in Interface Builder
LET’S WRITE AN APP!
Create View with Interface BuilderAdd outlets and action to Controller
Concatenate two NSStringsDisplay calculated value in View
SUMMARY
Different terms, similar ideasXcode is Apple’s free IDE
Objective-C is (kinda) like C#Foundation contains common classesUIKit and Interface Builder create UIs
There is a lot more to know...
LEARN MORE
iosForDotNetDevs.com‘iOS Programming for .NET Developers’
Q&A