![Page 1: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/1.jpg)
Stanford CS193pDeveloping Applications for iOS
Fall 2011
Stanford CS193pFall 2011
![Page 2: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/2.jpg)
TodayWhat is this class all about?DescriptionPrerequisitesHomework / Final Project
iOS OverviewWhat’s in iOS?
MVCObject-Oriented Design Concept
Objective CNew language!Basic concepts only for today.
Stanford CS193pFall 2011
![Page 3: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/3.jpg)
What will I learn in this course?How to build cool appsEasy to build even very complex applicationsResult lives in your pocket!Very easy to distribute your application through the AppStoreVibrant development community
Real-life Object-Oriented ProgrammingThe heart of Cocoa Touch is 100% object-orientedApplication of MVC design modelMany computer science concepts applied in a commercial development platform: Databases, Graphics, Multimedia, Multithreading, Animation, Networking, and much, much more!Numerous students have gone on to sell products on the AppStore
Stanford CS193pFall 2011
![Page 4: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/4.jpg)
PrerequisitesMost Important Prereq!Object-Oriented ProgrammingCS106A&B required, CS107 recommended
Object-Oriented TermsClass (description/template for an object)Instance (manifestation of a class)Message (sent to object to make it act)Method (code invoked by a Message)Instance Variable (object-specific storage)Superclass/Subclass (Inheritance)Protocol (non-class-specific methods)
You should know these terms!If you are not very comfortable with all of these, this might not be the class for you
Programming ExperienceThis is an upper-level CS course.If you have never written a program where you had to design and implement more than a handful of classes, this will be a big step up in difficulty for you.
Stanford CS193pFall 2011
![Page 5: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/5.jpg)
AssignmentsWeekly Homework7 weekly assignmentsAssigned Thursday after lectureDue the following Wednesday at 11:59pmIndividual work onlyHomework graded ✓, ✓+ and ✓- based on Required Tasks and Evaluation criteriaLots of extra credit available, bank itOnly 3 “free” late days per quarter#1 fail: falling behind on homework
Final Project3 weeks to work on itBut weighted like 4 weeks of homeworkProposal requires instructor approvalSome teams of 2 might be allowedKeynote presentation required (3 mins or so)
Stanford CS193pFall 2011
![Page 6: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/6.jpg)
Core OSOSX Kernel
Mach 3.0
BSD
Sockets
Security
Power Management
Keychain Access
Certificates
File System
Bonjour
iOSCocoa Touch
Media
Core Services
Core OS
Stanford CS193pFall 2011
![Page 7: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/7.jpg)
Core ServicesCollections
Address Book
Networking
File Access
SQLite
Core Location
Net Services
Threading
Preferences
URL Utilities
iOSCocoa Touch
Media
Core Services
Core OS
Stanford CS193pFall 2011
![Page 8: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/8.jpg)
MediaCore Audio
OpenAL
Audio Mixing
Audio Recording
Video Playback
JPEG, PNG, TIFF
Quartz (2D)
Core Animation
OpenGL ES
iOSCocoa Touch
Media
Core Services
Core OS
Stanford CS193pFall 2011
![Page 9: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/9.jpg)
Cocoa TouchMulti-Touch
Core Motion
View Hierarchy
Localization
Controls
Alerts
Web View
Map Kit
Image Picker
Camera
iOSCocoa Touch
Media
Core Services
Core OS
Stanford CS193pFall 2011
![Page 10: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/10.jpg)
Platform Components
Tools
Language
Frameworks
Design Strategies
[display setTextColor:[UIColor blackColor]];
Foundation UIKit
MVCCor
e Data
Map Kit
Xcode 4 Instruments
Core Motion
Stanford CS193pFall 2011
![Page 11: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/11.jpg)
Controller
MVC
Model View
Divide objects in your program into 3 “camps.”Stanford CS193p
Fall 2011
![Page 12: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/12.jpg)
Controller
MVC
Model View
Model = What your application is (but not how it is displayed)Stanford CS193p
Fall 2011
![Page 13: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/13.jpg)
Controller
MVC
Model View
Controller = How your Model is presented to the user (UI logic)Stanford CS193p
Fall 2011
![Page 14: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/14.jpg)
Controller
MVC
Model View
View = Your Controller’s minionsStanford CS193p
Fall 2011
![Page 15: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/15.jpg)
Controller
MVC
Model View
It’s all about managing communication between campsStanford CS193p
Fall 2011
![Page 16: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/16.jpg)
Controller
MVC
Model View
Controllers can always talk directly to their Model.Stanford CS193p
Fall 2011
![Page 17: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/17.jpg)
Controller
MVC
Model View
outlet
Controllers can also talk directly to their View.Stanford CS193p
Fall 2011
![Page 18: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/18.jpg)
Controller
MVC
Model View
outlet
The Model and View should never speak to each other.Stanford CS193p
Fall 2011
![Page 19: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/19.jpg)
Controller
MVC
Model View
?outlet
Can the View speak to its Controller?Stanford CS193p
Fall 2011
![Page 20: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/20.jpg)
Controller
MVC
Model View
outlet
Sort of. Communication is “blind” and structured.Stanford CS193p
Fall 2011
![Page 21: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/21.jpg)
Controller
MVC
Model View
outlet
target
The Controller can drop a target on itself.Stanford CS193p
Fall 2011
![Page 22: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/22.jpg)
Controller
MVC
Model View
action
outlet
target
Then hand out an action to the View.Stanford CS193p
Fall 2011
![Page 23: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/23.jpg)
Controller
MVC
Model View
action
outlet
target
The View sends the action when things happen in the UI.Stanford CS193p
Fall 2011
![Page 24: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/24.jpg)
Controller
MVC
Model View
action
outlet
should
will did
target
Sometimes the View needs to synchronize with the Controller.Stanford CS193p
Fall 2011
![Page 25: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/25.jpg)
Controller
MVC
Model View
action
delegate
outlet
should
will did
target
The Controller sets itself as the View’s delegate.Stanford CS193p
Fall 2011
![Page 26: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/26.jpg)
Controller
MVC
Model View
action
delegate
outlet
should
will did
target
The delegate is set via a protocol (i.e. it’s “blind” to class).Stanford CS193p
Fall 2011
![Page 27: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/27.jpg)
Controller
MVC
Model View
action
delegate
outlet
should
will did
target
Views do not own the data they display.Stanford CS193p
Fall 2011
![Page 28: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/28.jpg)
Controller
MVC
Model View
action
delegate
outlet
should
will did
target
countdataat
So, if needed, they have a protocol to acquire it.Stanford CS193p
Fall 2011
![Page 29: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/29.jpg)
Controller
MVC
Model View
action
delegate
outlet
data source
should
will did
target
countdataat
Controllers are almost always that data source (not Model!).Stanford CS193p
Fall 2011
![Page 30: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/30.jpg)
Controllers interpret/format Model information for the View.
Controller
MVC
Model View
action
delegate
outlet
data source
should
will did
target
countdataat
Stanford CS193pFall 2011
![Page 31: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/31.jpg)
Controller
MVC
Model View
action
? delegate
outlet
data source
should
will did
target
countdataat
Can the Model talk directly to the Controller?Stanford CS193p
Fall 2011
![Page 32: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/32.jpg)
Controller
MVC
Model View
action
delegate
outlet
data source
should
will did
target
countdataat
No. The Model is (should be) UI independent.Stanford CS193p
Fall 2011
![Page 33: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/33.jpg)
Controller
MVC
Model View
action
delegate
outlet
data source
should
will did
target
countdataat
So what if the Model has information to update or something?Stanford CS193p
Fall 2011
![Page 34: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/34.jpg)
Controller
MVC
Model View
action
Notification& KVO
delegate
outlet
data source
should
will did
target
countdataat
It uses a “radio station”-like broadcast mechanism.Stanford CS193p
Fall 2011
![Page 35: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/35.jpg)
Controller
MVC
Model View
action
Notification& KVO
delegate
outlet
data source
should
will did
target
countdataat
Controllers (or other Model) “tune in” to interesting stuff.Stanford CS193p
Fall 2011
![Page 36: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/36.jpg)
A View might “tune in,” but probably not to a Model’s “station.”
Controller
MVC
Model View
action
Notification& KVO
delegate
outlet
data source
should
will did
target
countdataat
Stanford CS193pFall 2011
![Page 37: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/37.jpg)
Controller
MVC
Model View
action
Notification& KVO
delegate
outlet
data source
should
will did
target
countdataat
Now combine MVC groups to make complicated programs ...Stanford CS193p
Fall 2011
![Page 38: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/38.jpg)
MVCs working together
Stanford CS193pFall 2011
![Page 39: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/39.jpg)
MVCs not working together
Stanford CS193pFall 2011
![Page 40: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/40.jpg)
Objective-CNew language to learn!Strict superset of CAdds syntax for classes, methods, etc.A few things to “think differently” about (e.g. properties, dynamic binding)
Most important concept to understand today: PropertiesUsually we do not access instance variables directly in Objective-C.Instead, we use “properties.”A “property” is just the combination of a getter method and a setter method in a class.The getter has the name of the property (e.g. “myValue”)The setter’s name is “set” plus capitalized property name (e.g. “setMyValue:”)(To make this look nice, we always use a lowercase letter as the first letter of a property name.)We just call the setter to store the value we want and the getter to get it. Simple.
This is just your first glimpse of this language!We’ll go much more into the details next week.Don’t get too freaked out by the syntax at this point.
Stanford CS193pFall 2011
![Page 41: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/41.jpg)
Objective-C#import "Vehicle.h"
@interface Spaceship : Vehicle
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@implementation Spaceship
@endStanford CS193p
Fall 2011
Superclass’s header file.This is often <UIKit/UIKit.h> .
SuperclassClass name
Importing our own header file.
Note, superclass not specified here.
![Page 42: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/42.jpg)
Objective-C#import "Vehicle.h"
@interface Spaceship : Vehicle
// declaration of public methods
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@implementation Spaceship
// implementation of public and private methods
@endStanford CS193p
Fall 2011
![Page 43: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/43.jpg)
Objective-C#import "Vehicle.h"
@interface Spaceship : Vehicle
// declaration of public methods
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)
@end
@implementation Spaceship
// implementation of public and private methods
@endStanford CS193p
Fall 2011
Don’t forget the ().
No superclass here either.
![Page 44: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/44.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)
@end
@implementation Spaceship
// implementation of public and private methods
@endStanford CS193p
Fall 2011
The full name of this method is orbitPlanet:atAltitude:
It does not return any value.
It takes two arguments.Note how each is preceded by its own keyword.
Lining up the colons makes things look nice.
We need to import Planet.h for method declaration below to work.
![Page 45: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/45.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)
@end
@implementation Spaceship
// implementation of public and private methods
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
No semicolon here.
![Page 46: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/46.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
- (void)setTopSpeed:(double)percentSpeedOfLight;- (double)topSpeed;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)
@end
@implementation Spaceship
// implementation of public and private methods
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
![Page 47: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/47.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
- (void)setTopSpeed:(double)percentSpeedOfLight;- (double)topSpeed;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)
@end
@implementation Spaceship
// implementation of public and private methods
- (void)setTopSpeed:(double)speed{ ???}
- (double)topSpeed{ ???}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
![Page 48: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/48.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
- (void)setTopSpeed:(double)percentSpeedOfLight;- (double)topSpeed;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)
@end
@implementation Spaceship
// implementation of public and private methods
- (void)setTopSpeed:(double)speed{ ???}
- (double)topSpeed{ ???}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
This @property essentially declares the two “topSpeed” methods below.
nonatomic means its setter and getter are not thread-safe.That’s no problem if this is UI code because all UI code happens
on the main thread of the application.
![Page 49: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/49.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)
@end
@implementation Spaceship
// implementation of public and private methods
- (void)setTopSpeed:(double)speed{ ???}
- (double)topSpeed{ ???}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
We never declare both the @property and its setter and getter in the header file
(just the @property).
![Page 50: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/50.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)
@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;
- (void)setTopSpeed:(double)speed{ ???}
- (double)topSpeed{ ???}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
We almost always use @synthesize to create the implementation of the setter and getter for a @property.
It both creates the setter and getter methods AND creates some storage to hold the value.
This is the name of the storage location to use.
_ (underbar) then the name of the property is a common naming convention.
If we don’t use = here, @synthesize uses the name of the property(which is bad so always use =).
![Page 51: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/51.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)
@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;
- (void)setTopSpeed:(double)speed{ _topSpeed = speed;}
- (double)topSpeed{ return _topSpeed;}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
This is what the methods created by @synthesize
would look like.
![Page 52: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/52.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)
@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
Most of the time, you can let @synthesize do all the work of creating setters and getters
![Page 53: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/53.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)
@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;
- (void)setTopSpeed:(double)speed{ if ((speed < 1) && (speed > 0)) _topSpeed = speed;}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
However, we can create our own if there is any special work to do when setting or getting.
![Page 54: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/54.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)@property (nonatomic, strong) Wormhole *nearestWormhole;@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;
- (void)setTopSpeed:(double)speed{ if ((speed < 1) && (speed > 0)) _topSpeed = speed;}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
Here’s another @property.This one is private (because it’s in our .m file).
![Page 55: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/55.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)@property (nonatomic, strong) Wormhole *nearestWormhole;@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;
- (void)setTopSpeed:(double)speed{ if ((speed < 1) && (speed > 0)) _topSpeed = speed;}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
It’s a pointer to an object (of class Wormhole).It’s strong which means that the memory used by this
object will stay around for as long as we need it.
All objects are always allocated on the heap.So we always access them through a pointer. Always.
![Page 56: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/56.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)@property (nonatomic, strong) Wormhole *nearestWormhole;@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;@synthesize nearestWormhole = _nearestWormhole;
- (void)setTopSpeed:(double)speed{ if ((speed < 1) && (speed > 0)) _topSpeed = speed;}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here}
@endStanford CS193p
Fall 2011
This creates the setter and getter for our new @property.
@synthesize does NOT create storage for the object this pointer points to.It just allocates room for the pointer.
We’ll talk about how to allocate and initialize the objects themselves next week.
![Page 57: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/57.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)@property (nonatomic, strong) Wormhole *nearestWormhole;@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;@synthesize nearestWormhole = _nearestWormhole;
- (void)setTopSpeed:(double)speed{ if ((speed < 1) && (speed > 0)) _topSpeed = speed;}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here
}
@endStanford CS193p
Fall 2011
Now let’s take a look at some example coding.This is just to get a feel for Objective-C syntax.
![Page 58: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/58.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)@property (nonatomic, strong) Wormhole *nearestWormhole;@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;@synthesize nearestWormhole = _nearestWormhole;
- (void)setTopSpeed:(double)speed{ if ((speed < 1) && (speed > 0)) _topSpeed = speed;}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here double speed = [self topSpeed]; if (speed > MAX_RELATIVE) speed = MAX_RELATIVE;
}
@endStanford CS193p
Fall 2011
We’re calling topSpeed’s getter on ourself here.
The “square brackets” syntax is used to send messages.
![Page 59: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/59.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
- (void)setTopSpeed:(double)percentSpeedOfLight;- (double)topSpeed;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)@property (nonatomic, strong) Wormhole *nearestWormhole;@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;@synthesize nearestWormhole = _nearestWormhole;
- (void)setTopSpeed:(double)speed{ if ((speed < 1) && (speed > 0)) _topSpeed = speed;}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here double speed = [self topSpeed]; if (speed > MAX_RELATIVE) speed = MAX_RELATIVE;
}
@endStanford CS193p
Fall 2011
A reminder of what our getter declaration looks like.Recall that these two declarations are accomplished with
the @property for topSpeed above.
![Page 60: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/60.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)@property (nonatomic, strong) Wormhole *nearestWormhole;@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;@synthesize nearestWormhole = _nearestWormhole;
- (void)setTopSpeed:(double)speed{ if ((speed < 1) && (speed > 0)) _topSpeed = speed;}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here double speed = [self topSpeed]; if (speed > MAX_RELATIVE) speed = MAX_RELATIVE; [[self nearestWormhole] travelToPlanet:aPlanet atSpeed:speed];}
@endStanford CS193p
Fall 2011
Here’s another example of sending a message.It looks like this method has 2 arguments:
a Planet to travel to and a speed to travel at.It is being sent to an instance of Wormhole. Square brackets inside square brackets.
![Page 61: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/61.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)@property (nonatomic, strong) Wormhole *nearestWormhole;@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;@synthesize nearestWormhole = _nearestWormhole;
- (void)setTopSpeed:(double)speed{ if ((speed < 1) && (speed > 0)) _topSpeed = speed;}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here double speed = self.topSpeed; if (speed > MAX_RELATIVE) speed = MAX_RELATIVE; [[self nearestWormhole] travelToPlanet:aPlanet atSpeed:speed];}
@endStanford CS193p
Fall 2011
Calling getters and setters is such an important task, it has its own syntax: dot notation.
This is identical to [self topSpeed].
![Page 62: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/62.jpg)
Objective-C#import "Vehicle.h"#import "Planet.h"
@interface Spaceship : Vehicle
// declaration of public methods
@property (nonatomic) double topSpeed;
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km;
@end
Spaceship.h Spaceship.m#import "Spaceship.h"
@interface Spaceship()// declaration of private methods (as needed)@property (nonatomic, strong) Wormhole *nearestWormhole;@end
@implementation Spaceship
// implementation of public and private methods
@synthesize topSpeed = _topSpeed;@synthesize nearestWormhole = _nearestWormhole;
- (void)setTopSpeed:(double)speed{ if ((speed < 1) && (speed > 0)) _topSpeed = speed;}
- (void)orbitPlanet:(Planet *)aPlanet atAltitude:(double)km{ // put the code to orbit a planet here double speed = self.topSpeed; if (speed > MAX_RELATIVE) speed = MAX_RELATIVE; [self.nearestWormhole travelToPlanet:aPlanet atSpeed:speed];}
@endStanford CS193p
Fall 2011We can use dot notation here too.
![Page 63: iOS Programming - MCV (Delegate/Protocols/Property&Syntax)](https://reader034.vdocuments.us/reader034/viewer/2022052617/5453644eaf795919308b520f/html5/thumbnails/63.jpg)
Coming UpNext LectureOverview of the Integrated Development Environment (IDE, i.e. Xcode 4)Objective-C in actionConcrete example of MVCMajor demonstration of all of the above: RPN Calculator (HOMEWORK: if you do not know what an RPN Calculator is, look it up on the internet.)
FridayVery simple introduction to using the debugger.Optional. You can figure it out on your own if you want (not too difficult).
Next WeekObjective-C language in depthFoundation classes: arrays, dictionaries, strings, etc.Dynamic vs. static typingProtocols, categories and much, much more!
Stanford CS193pFall 2011