CS193P - Lecture 3
           iPhone Application Development

           Custom Classes
           Object Lifecycle
      ...
Announcements
        • Assignments 1A and 1B due Wednesday 1/13 at 11:59 PM
            ■ Enrolled Stanford students can ...
Announcements
        • Assignments 2A and 2B due Wednesday 1/20 at 11:59 PM
            ■   2A: Continuation of Foundatio...
Enrolled students & iTunes U
        • Lectures have begun showing up on iTunes U
        • Lead time is longer than last ...
Office Hours
        • Paul’s office hours: Thursday 2-4, Gates B26B
        • David’s office hours: Mondays 4-6pm: Gates ...
Today’s Topics
        • Questions from Assignment 1A or 1B?
        • Creating Custom Classes
        • Object Lifecycle
...
Custom Classes




Tuesday, January 12, 2010   7
Design Phase




Tuesday, January 12, 2010   8
Design Phase
        • Create a class
            ■   Person




Tuesday, January 12, 2010   8
Design Phase
        • Create a class
            ■   Person
        • Determine the superclass
            ■   NSObject (...
Design Phase
        • Create a class
            ■   Person
        • Determine the superclass
            ■   NSObject (...
Design Phase
        • Create a class
            ■   Person
        • Determine the superclass
            ■   NSObject (...
Defining a class
                 A public header and a private implementation




                            Header File...
Defining a class
                 A public header and a private implementation




                            Header File...
Class interface declared in header file




Tuesday, January 12, 2010                        10
Class interface declared in header file

         @interface Person




         @end

Tuesday, January 12, 2010          ...
Class interface declared in header file

         @interface Person   : NSObject




         @end

Tuesday, January 12, 2...
Class interface declared in header file
         #import <Foundation/Foundation.h>

         @interface Person   : NSObjec...
Class interface declared in header file
         #import <Foundation/Foundation.h>

         @interface Person   : NSObjec...
Class interface declared in header file
         #import <Foundation/Foundation.h>

         @interface Person : NSObject
...
Class interface declared in header file
         #import <Foundation/Foundation.h>

         @interface Person : NSObject
...
Defining a class
                 A public header and a private implementation




                            Header File...
Implementing custom class
        • Implement setter/getter methods
        • Implement action methods




Tuesday, Januar...
Class Implementation




Tuesday, January 12, 2010     13
Class Implementation
         #import "Person.h"




Tuesday, January 12, 2010     13
Class Implementation
         #import "Person.h"

         @implementation Person




         @end




Tuesday, January 1...
Class Implementation
         #import "Person.h"

         @implementation Person

         - (int)age {
            retur...
Calling your own methods




Tuesday, January 12, 2010         14
Calling your own methods
         #import "Person.h"

         @implementation Person

         - (BOOL)canLegallyVote {

...
Calling your own methods
         #import "Person.h"

         @implementation Person

         - (BOOL)canLegallyVote {
 ...
Calling your own methods
         #import "Person.h"

         @implementation Person

         - (BOOL)canLegallyVote {
 ...
Superclass methods
        • As we just saw, objects have an implicit variable named “self”
            ■   Like “this” in...
Superclass methods
        • As we just saw, objects have an implicit variable named “self”
            ■   Like “this” in...
Object Lifecycle




Tuesday, January 12, 2010   16
Object Lifecycle
        • Creating objects
        • Memory management
        • Destroying objects




Tuesday, January ...
Object Creation




Tuesday, January 12, 2010   18
Object Creation
       • Two step process
            ■ allocate memory to store the object
            ■ initialize objec...
Object Creation
       • Two step process
            ■ allocate memory to store the object
            ■ initialize objec...
Object Creation
       • Two step process
            ■ allocate memory to store the object
            ■ initialize objec...
Create = Allocate + Initialize




Tuesday, January 12, 2010               19
Create = Allocate + Initialize
         Person *person = nil;




Tuesday, January 12, 2010               19
Create = Allocate + Initialize
         Person *person = nil;

         person = [[Person alloc] init];




Tuesday, Janua...
Implementing your own -init method
         #import "Person.h"

         @implementation Person




         @end



Tuesd...
Implementing your own -init method
         #import "Person.h"

         @implementation Person

         - (id)init {



...
Implementing your own -init method
         #import "Person.h"

         @implementation Person

         - (id)init {
   ...
Implementing your own -init method
         #import "Person.h"

         @implementation Person

         - (id)init {
   ...
Multiple init methods
        • Classes may define multiple init methods
            - (id)init;
            - (id)initWit...
Multiple init methods
        • Classes may define multiple init methods
            - (id)init;
            - (id)initWit...
Finishing Up With an Object
         Person *person = nil;

         person = [[Person alloc] init];




Tuesday, January ...
Finishing Up With an Object
         Person *person = nil;

         person = [[Person alloc] init];

         [person set...
Finishing Up With an Object
         Person *person = nil;

         person = [[Person alloc] init];

         [person set...
Memory Management

                                          Allocation   Destruction
                                C   ...
Memory Management

                                          Allocation   Destruction
                                C   ...
Memory Management

                                          Allocation   Destruction
                                C   ...
Memory Management

                                          Allocation   Destruction
                                C   ...
Memory Management

                                          Allocation   Destruction
                                C   ...
Reference Counting




Tuesday, January 12, 2010   24
Reference Counting
        • Every object has a retain count
            ■ Defined on NSObject
            ■ As long as re...
Reference Counting
        • Every object has a retain count
            ■ Defined on NSObject
            ■ As long as re...
Reference Counting
        • Every object has a retain count
            ■ Defined on NSObject
            ■ As long as re...
Reference Counting
        • Every object has a retain count
            ■ Defined on NSObject
            ■ As long as re...
Reference Counting
        • Every object has a retain count
            ■ Defined on NSObject
            ■ As long as re...
Balanced Calls
         Person *person = nil;

         person = [[Person alloc] init];




Tuesday, January 12, 2010     ...
Balanced Calls
         Person *person = nil;

         person = [[Person alloc] init];

         [person setName:@“Jimmy ...
Balanced Calls
         Person *person = nil;

         person = [[Person alloc] init];

         [person setName:@“Jimmy ...
Reference counting in action




Tuesday, January 12, 2010             26
Reference counting in action
         Person *person = [[Person alloc] init];




Tuesday, January 12, 2010               ...
Reference counting in action
         Person *person = [[Person alloc] init];

               Retain count begins at 1 wit...
Reference counting in action
         Person *person = [[Person alloc] init];

               Retain count begins at 1 wit...
Reference counting in action
         Person *person = [[Person alloc] init];

               Retain count begins at 1 wit...
Reference counting in action
         Person *person = [[Person alloc] init];

               Retain count begins at 1 wit...
Reference counting in action
         Person *person = [[Person alloc] init];

               Retain count begins at 1 wit...
Reference counting in action
         Person *person = [[Person alloc] init];

               Retain count begins at 1 wit...
Reference counting in action
         Person *person = [[Person alloc] init];

               Retain count begins at 1 wit...
Messaging deallocated objects




Tuesday, January 12, 2010              27
Messaging deallocated objects
           Person *person = [[Person alloc] init];
           // ...
           [person rele...
Messaging deallocated objects
           Person *person = [[Person alloc] init];
           // ...
           [person rele...
Messaging deallocated objects
           Person *person = [[Person alloc] init];
           // ...
           [person rele...
Messaging deallocated objects
           Person *person = [[Person alloc] init];
           // ...
           [person rele...
Messaging deallocated objects
           Person *person = [[Person alloc] init];
           // ...
           [person rele...
Implementing a -dealloc method
         #import "Person.h"

         @implementation Person




         @end




Tuesday,...
Implementing a -dealloc method
         #import "Person.h"

         @implementation Person

         - (void)dealloc {


...
Implementing a -dealloc method
         #import "Person.h"

         @implementation Person

         - (void)dealloc {
  ...
Implementing a -dealloc method
         #import "Person.h"

         @implementation Person

         - (void)dealloc {
  ...
Object Lifecycle Recap
       • Objects begin with a retain count of 1
       • Increase and decrease with -retain and -re...
Object Ownership
         #import <Foundation/Foundation.h>

         @interface Person : NSObject
         {
            ...
Object Ownership
         #import "Person.h"

         @implementation Person




         @end




Tuesday, January 12, 2...
Object Ownership
         #import "Person.h"

         @implementation Person

         - (NSString *)name {
            r...
Object Ownership
         #import "Person.h"

         @implementation Person

         - (NSString *)name {
            r...
Object Ownership
         #import "Person.h"

         @implementation Person

         - (NSString *)name {
            r...
Object Ownership
         #import "Person.h"

         @implementation Person

         - (NSString *)name {
            r...
Releasing Instance Variables
         #import "Person.h"

         @implementation Person




         @end




Tuesday, J...
Releasing Instance Variables
         #import "Person.h"

         @implementation Person

         - (void)dealloc {




...
Releasing Instance Variables
         #import "Person.h"

         @implementation Person

         - (void)dealloc {
    ...
Releasing Instance Variables
         #import "Person.h"

         @implementation Person

         - (void)dealloc {
    ...
Autorelease




Tuesday, January 12, 2010   33
Returning a newly created object
             - (NSString *)fullName {
                NSString *result;

                ...
Returning a newly created object
             - (NSString *)fullName {
                NSString *result;

                ...
Returning a newly created object
             - (NSString *)fullName {
                NSString *result;

                ...
Returning a newly created object
             - (NSString *)fullName {
                NSString *result;

                ...
Returning a newly created object
             - (NSString *)fullName {
                NSString *result;

                ...
Returning a newly created object
             - (NSString *)fullName {
                NSString *result;

                ...
Returning a newly created object
             - (NSString *)fullName {
                NSString *result;

                ...
Autoreleasing Objects
        • Calling -autorelease flags an object to be sent release at some
          point in the fut...
Method Names & Autorelease




Tuesday, January 12, 2010           36
Method Names & Autorelease
        • Methods whose names includes alloc, copy, or new
          return a retained object t...
Method Names & Autorelease
        • Methods whose names includes alloc, copy, or new
          return a retained object t...
Method Names & Autorelease
        • Methods whose names includes alloc, copy, or new
          return a retained object t...
Method Names & Autorelease
        • Methods whose names includes alloc, copy, or new
          return a retained object t...
Method Names & Autorelease
        • Methods whose names includes alloc, copy, or new
          return a retained object t...
How does -autorelease work?




Tuesday, January 12, 2010            37
How does -autorelease work?
        • Object is added to current autorelease pool




Tuesday, January 12, 2010           ...
How does -autorelease work?
        • Object is added to current autorelease pool
        • Autorelease pools track object...
How does -autorelease work?
        • Object is added to current autorelease pool
        • Autorelease pools track object...
Autorelease Pools (in pictures)




                 pp                  d
              ha                lize           ...
Autorelease Pools (in pictures)

              Pool




                                                                  ...
Autorelease Pools (in pictures)

              Pool                                                                       ...
Autorelease Pools (in pictures)

              Pool                                                                       ...
Autorelease Pools (in pictures)

              Pool                                                                       ...
Autorelease Pools (in pictures)

              Pool                                                                       ...
Autorelease Pools (in pictures)

              Pool                                                                       ...
Autorelease Pools (in pictures)

              Pool                                                                       ...
Autorelease Pools (in pictures)
                                                [object release];


              Pool    ...
Autorelease Pools (in pictures)

              Pool                                                                       ...
Hanging Onto an Autoreleased Object
        • Many methods return autoreleased objects
            ■ Remember the naming c...
Hanging Onto an Autoreleased Object
        • Many methods return autoreleased objects
            ■ Remember the naming c...
Side Note: Garbage Collection
        • Autorelease is not garbage collection
        • Objective-C on iPhone OS does not ...
Objective-C Properties




Tuesday, January 12, 2010        41
Properties
        • Provide access to object attributes
        • Shortcut to implementing getter/setter methods
        ...
Defining Properties
         #import <Foundation/Foundation.h>

         @interface Person : NSObject
         {
         ...
Defining Properties
         #import <Foundation/Foundation.h>

         @interface Person : NSObject
         {
         ...
Defining Properties
         #import <Foundation/Foundation.h>

         @interface Person : NSObject
         {
         ...
Defining Properties
         #import <Foundation/Foundation.h>

         @interface Person : NSObject
         {
         ...
Defining Properties
         #import <Foundation/Foundation.h>

         @interface Person : NSObject
         {
         ...
Synthesizing Properties
         @implementation Person

         - (int)age {
            return age;
         }
        ...
Synthesizing Properties
         @implementation Person

         - (int)age {
            return age;
         }
        ...
Synthesizing Properties
         @implementation Person

         - (int)age {
                age
            return age;...
Synthesizing Properties
         @implementation Person

         @synthesize age;
         @synthesize name;
          - ...
Property Attributes
        • Read-only versus read-write
          ! @property int age; // read-write by default
        ...
Property Names vs. Instance Variables
        • Property name can be different than instance variable
            @interfa...
Property Names vs. Instance Variables
        • Property name can be different than instance variable
             @interf...
Properties
        • Mix and match synthesized and implemented properties
              @implementation Person
           ...
Properties In Practice
        • Newer APIs use @property
        • Older APIs use getter/setter methods
        • Propert...
Dot Syntax and self
        • When used in custom methods, be careful with dot syntax for
          properties defined in ...
Dot Syntax and self
        • When used in custom methods, be careful with dot syntax for
          properties defined in ...
Common Pitfall with Dot Syntax
        What will happen when this code executes?
                    @implementation Perso...
Common Pitfall with Dot Syntax
        What will happen when this code executes?
                    @implementation Perso...
Further Reading
        • Objective-C 2.0 Programming Language
            ■ “Defining a Class”
            ■ “Declared Pr...
Questions?




Tuesday, January 12, 2010   54
Upcoming SlideShare
Loading in …5
×

03 Custom Classes

1,595 views

Published on

Published in: Technology
  • Be the first to comment

03 Custom Classes

  1. 1. CS193P - Lecture 3 iPhone Application Development Custom Classes Object Lifecycle Autorelease Properties Tuesday, January 12, 2010 1
  2. 2. Announcements • Assignments 1A and 1B due Wednesday 1/13 at 11:59 PM ■ Enrolled Stanford students can email cs193p@cs.stanford.edu with any questions ■ Submit early! Instructions on the website... ■ Delete the “build” directory manually, Xcode won’t do it Tuesday, January 12, 2010 2
  3. 3. Announcements • Assignments 2A and 2B due Wednesday 1/20 at 11:59 PM ■ 2A: Continuation of Foundation tool ■ Add custom class ■ Basic memory management ■ 2B: Beginning of first iPhone application ■ Topics to be covered on Thursday, 1/14 ■ Assignment contains extensive walkthrough Tuesday, January 12, 2010 3
  4. 4. Enrolled students & iTunes U • Lectures have begun showing up on iTunes U • Lead time is longer than last year • Come to class!! ■ Lectures may not post in time for assignments Tuesday, January 12, 2010 4
  5. 5. Office Hours • Paul’s office hours: Thursday 2-4, Gates B26B • David’s office hours: Mondays 4-6pm: Gates 360 Tuesday, January 12, 2010 5
  6. 6. Today’s Topics • Questions from Assignment 1A or 1B? • Creating Custom Classes • Object Lifecycle • Autorelease • Objective-C Properties Tuesday, January 12, 2010 6
  7. 7. Custom Classes Tuesday, January 12, 2010 7
  8. 8. Design Phase Tuesday, January 12, 2010 8
  9. 9. Design Phase • Create a class ■ Person Tuesday, January 12, 2010 8
  10. 10. Design Phase • Create a class ■ Person • Determine the superclass ■ NSObject (in this case) Tuesday, January 12, 2010 8
  11. 11. Design Phase • Create a class ■ Person • Determine the superclass ■ NSObject (in this case) • What properties should it have? ■ Name, age, whether they can vote Tuesday, January 12, 2010 8
  12. 12. Design Phase • Create a class ■ Person • Determine the superclass ■ NSObject (in this case) • What properties should it have? ■ Name, age, whether they can vote • What actions can it perform? ■ Cast a ballot Tuesday, January 12, 2010 8
  13. 13. Defining a class A public header and a private implementation Header File Implementation File Tuesday, January 12, 2010 9
  14. 14. Defining a class A public header and a private implementation Header File Implementation File Tuesday, January 12, 2010 9
  15. 15. Class interface declared in header file Tuesday, January 12, 2010 10
  16. 16. Class interface declared in header file @interface Person @end Tuesday, January 12, 2010 10
  17. 17. Class interface declared in header file @interface Person : NSObject @end Tuesday, January 12, 2010 10
  18. 18. Class interface declared in header file #import <Foundation/Foundation.h> @interface Person : NSObject @end Tuesday, January 12, 2010 10
  19. 19. Class interface declared in header file #import <Foundation/Foundation.h> @interface Person : NSObject { } @end Tuesday, January 12, 2010 10
  20. 20. Class interface declared in header file #import <Foundation/Foundation.h> @interface Person : NSObject { // instance variables NSString *name; int age; } @end Tuesday, January 12, 2010 10
  21. 21. Class interface declared in header file #import <Foundation/Foundation.h> @interface Person : NSObject { // instance variables NSString *name; int age; } // method declarations - (NSString *)name; - (void)setName:(NSString *)value; - (int)age; - (void)setAge:(int)age; - (BOOL)canLegallyVote; - (void)castBallot; @end Tuesday, January 12, 2010 10
  22. 22. Defining a class A public header and a private implementation Header File Implementation File Tuesday, January 12, 2010 11
  23. 23. Implementing custom class • Implement setter/getter methods • Implement action methods Tuesday, January 12, 2010 12
  24. 24. Class Implementation Tuesday, January 12, 2010 13
  25. 25. Class Implementation #import "Person.h" Tuesday, January 12, 2010 13
  26. 26. Class Implementation #import "Person.h" @implementation Person @end Tuesday, January 12, 2010 13
  27. 27. Class Implementation #import "Person.h" @implementation Person - (int)age { return age; } - (void)setAge:(int)value { age = value; } //... and other methods @end Tuesday, January 12, 2010 13
  28. 28. Calling your own methods Tuesday, January 12, 2010 14
  29. 29. Calling your own methods #import "Person.h" @implementation Person - (BOOL)canLegallyVote { } - (void)castBallot { } @end Tuesday, January 12, 2010 14
  30. 30. Calling your own methods #import "Person.h" @implementation Person - (BOOL)canLegallyVote { return ([self age] >= 18); } - (void)castBallot { } @end Tuesday, January 12, 2010 14
  31. 31. Calling your own methods #import "Person.h" @implementation Person - (BOOL)canLegallyVote { return ([self age] >= 18); } - (void)castBallot { if ([self canLegallyVote]) { // do voting stuff } else { NSLog (@“I’m not allowed to vote!”); } } @end Tuesday, January 12, 2010 14
  32. 32. Superclass methods • As we just saw, objects have an implicit variable named “self” ■ Like “this” in Java and C++ • Can also invoke superclass methods using “super” Tuesday, January 12, 2010 15
  33. 33. Superclass methods • As we just saw, objects have an implicit variable named “self” ■ Like “this” in Java and C++ • Can also invoke superclass methods using “super” - (void)doSomething { // Call superclass implementation first [super doSomething]; // Then do our custom behavior int foo = bar; // ... } Tuesday, January 12, 2010 15
  34. 34. Object Lifecycle Tuesday, January 12, 2010 16
  35. 35. Object Lifecycle • Creating objects • Memory management • Destroying objects Tuesday, January 12, 2010 17
  36. 36. Object Creation Tuesday, January 12, 2010 18
  37. 37. Object Creation • Two step process ■ allocate memory to store the object ■ initialize object state Tuesday, January 12, 2010 18
  38. 38. Object Creation • Two step process ■ allocate memory to store the object ■ initialize object state + alloc ■ Class method that knows how much memory is needed Tuesday, January 12, 2010 18
  39. 39. Object Creation • Two step process ■ allocate memory to store the object ■ initialize object state + alloc ■ Class method that knows how much memory is needed - init ■ Instance method to set initial values, perform other setup Tuesday, January 12, 2010 18
  40. 40. Create = Allocate + Initialize Tuesday, January 12, 2010 19
  41. 41. Create = Allocate + Initialize Person *person = nil; Tuesday, January 12, 2010 19
  42. 42. Create = Allocate + Initialize Person *person = nil; person = [[Person alloc] init]; Tuesday, January 12, 2010 19
  43. 43. Implementing your own -init method #import "Person.h" @implementation Person @end Tuesday, January 12, 2010 20
  44. 44. Implementing your own -init method #import "Person.h" @implementation Person - (id)init { } @end Tuesday, January 12, 2010 20
  45. 45. Implementing your own -init method #import "Person.h" @implementation Person - (id)init { // allow superclass to initialize its state first if (self = [super init]) { } return self; } @end Tuesday, January 12, 2010 20
  46. 46. Implementing your own -init method #import "Person.h" @implementation Person - (id)init { // allow superclass to initialize its state first if (self = [super init]) { age = 0; name = @“Bob”; // do other initialization... } return self; } @end Tuesday, January 12, 2010 20
  47. 47. Multiple init methods • Classes may define multiple init methods - (id)init; - (id)initWithName:(NSString *)name; - (id)initWithName:(NSString *)name age:(int)age; Tuesday, January 12, 2010 21
  48. 48. Multiple init methods • Classes may define multiple init methods - (id)init; - (id)initWithName:(NSString *)name; - (id)initWithName:(NSString *)name age:(int)age; • Less specific ones typically call more specific with default values - (id)init { return [self initWithName:@“No Name”]; } - (id)initWithName:(NSString *)name { return [self initWithName:name age:0]; } Tuesday, January 12, 2010 21
  49. 49. Finishing Up With an Object Person *person = nil; person = [[Person alloc] init]; Tuesday, January 12, 2010 22
  50. 50. Finishing Up With an Object Person *person = nil; person = [[Person alloc] init]; [person setName:@“Jimmy Jones”]; [person setAge:32]; [person castBallot]; [person doSomethingElse]; Tuesday, January 12, 2010 22
  51. 51. Finishing Up With an Object Person *person = nil; person = [[Person alloc] init]; [person setName:@“Jimmy Jones”]; [person setAge:32]; [person castBallot]; [person doSomethingElse]; // What do we do with person when we’re done? Tuesday, January 12, 2010 22
  52. 52. Memory Management Allocation Destruction C malloc free Objective-C alloc dealloc Tuesday, January 12, 2010 23
  53. 53. Memory Management Allocation Destruction C malloc free Objective-C alloc dealloc Tuesday, January 12, 2010 23
  54. 54. Memory Management Allocation Destruction C malloc free Objective-C alloc dealloc Tuesday, January 12, 2010 23
  55. 55. Memory Management Allocation Destruction C malloc free Objective-C alloc dealloc • Calls must be balanced ■ Otherwise your program may leak or crash Tuesday, January 12, 2010 23
  56. 56. Memory Management Allocation Destruction C malloc free Objective-C alloc dealloc • Calls must be balanced ■ Otherwise your program may leak or crash • However, you’ll never call -dealloc directly ■ One exception, we’ll see in a bit... Tuesday, January 12, 2010 23
  57. 57. Reference Counting Tuesday, January 12, 2010 24
  58. 58. Reference Counting • Every object has a retain count ■ Defined on NSObject ■ As long as retain count is > 0, object is alive and valid Tuesday, January 12, 2010 24
  59. 59. Reference Counting • Every object has a retain count ■ Defined on NSObject ■ As long as retain count is > 0, object is alive and valid • +alloc and -copy create objects with retain count == 1 Tuesday, January 12, 2010 24
  60. 60. Reference Counting • Every object has a retain count ■ Defined on NSObject ■ As long as retain count is > 0, object is alive and valid • +alloc and -copy create objects with retain count == 1 • -retain increments retain count Tuesday, January 12, 2010 24
  61. 61. Reference Counting • Every object has a retain count ■ Defined on NSObject ■ As long as retain count is > 0, object is alive and valid • +alloc and -copy create objects with retain count == 1 • -retain increments retain count • -release decrements retain count Tuesday, January 12, 2010 24
  62. 62. Reference Counting • Every object has a retain count ■ Defined on NSObject ■ As long as retain count is > 0, object is alive and valid • +alloc and -copy create objects with retain count == 1 • -retain increments retain count • -release decrements retain count • When retain count reaches 0, object is destroyed • -dealloc method invoked automatically ■ One-way street, once you’re in -dealloc there’s no turning back Tuesday, January 12, 2010 24
  63. 63. Balanced Calls Person *person = nil; person = [[Person alloc] init]; Tuesday, January 12, 2010 25
  64. 64. Balanced Calls Person *person = nil; person = [[Person alloc] init]; [person setName:@“Jimmy Jones”]; [person setAge:32]; [person castBallot]; [person doSomethingElse]; Tuesday, January 12, 2010 25
  65. 65. Balanced Calls Person *person = nil; person = [[Person alloc] init]; [person setName:@“Jimmy Jones”]; [person setAge:32]; [person castBallot]; [person doSomethingElse]; // When we’re done with person, release it [person release]; // person will be destroyed here Tuesday, January 12, 2010 25
  66. 66. Reference counting in action Tuesday, January 12, 2010 26
  67. 67. Reference counting in action Person *person = [[Person alloc] init]; Tuesday, January 12, 2010 26
  68. 68. Reference counting in action Person *person = [[Person alloc] init]; Retain count begins at 1 with +alloc Tuesday, January 12, 2010 26
  69. 69. Reference counting in action Person *person = [[Person alloc] init]; Retain count begins at 1 with +alloc [person retain]; Tuesday, January 12, 2010 26
  70. 70. Reference counting in action Person *person = [[Person alloc] init]; Retain count begins at 1 with +alloc [person retain]; Retain count increases to 2 with -retain Tuesday, January 12, 2010 26
  71. 71. Reference counting in action Person *person = [[Person alloc] init]; Retain count begins at 1 with +alloc [person retain]; Retain count increases to 2 with -retain [person release]; Tuesday, January 12, 2010 26
  72. 72. Reference counting in action Person *person = [[Person alloc] init]; Retain count begins at 1 with +alloc [person retain]; Retain count increases to 2 with -retain [person release]; Retain count decreases to 1 with -release Tuesday, January 12, 2010 26
  73. 73. Reference counting in action Person *person = [[Person alloc] init]; Retain count begins at 1 with +alloc [person retain]; Retain count increases to 2 with -retain [person release]; Retain count decreases to 1 with -release [person release]; Tuesday, January 12, 2010 26
  74. 74. Reference counting in action Person *person = [[Person alloc] init]; Retain count begins at 1 with +alloc [person retain]; Retain count increases to 2 with -retain [person release]; Retain count decreases to 1 with -release [person release]; Retain count decreases to 0, -dealloc automatically called Tuesday, January 12, 2010 26
  75. 75. Messaging deallocated objects Tuesday, January 12, 2010 27
  76. 76. Messaging deallocated objects Person *person = [[Person alloc] init]; // ... [person release]; // Object is deallocated Tuesday, January 12, 2010 27
  77. 77. Messaging deallocated objects Person *person = [[Person alloc] init]; // ... [person release]; // Object is deallocated [person doSomething]; // Crash! Tuesday, January 12, 2010 27
  78. 78. Messaging deallocated objects Person *person = [[Person alloc] init]; // ... [person release]; // Object is deallocated Tuesday, January 12, 2010 27
  79. 79. Messaging deallocated objects Person *person = [[Person alloc] init]; // ... [person release]; // Object is deallocated person = nil; Tuesday, January 12, 2010 27
  80. 80. Messaging deallocated objects Person *person = [[Person alloc] init]; // ... [person release]; // Object is deallocated person = nil; [person doSomething]; // No effect Tuesday, January 12, 2010 27
  81. 81. Implementing a -dealloc method #import "Person.h" @implementation Person @end Tuesday, January 12, 2010 28
  82. 82. Implementing a -dealloc method #import "Person.h" @implementation Person - (void)dealloc { } @end Tuesday, January 12, 2010 28
  83. 83. Implementing a -dealloc method #import "Person.h" @implementation Person - (void)dealloc { // Do any cleanup that’s necessary // ... } @end Tuesday, January 12, 2010 28
  84. 84. Implementing a -dealloc method #import "Person.h" @implementation Person - (void)dealloc { // Do any cleanup that’s necessary // ... // when we’re done, call super to clean us up [super dealloc]; } @end Tuesday, January 12, 2010 28
  85. 85. Object Lifecycle Recap • Objects begin with a retain count of 1 • Increase and decrease with -retain and -release • When retain count reaches 0, object deallocated automatically • You never call dealloc explicitly in your code ■ Exception is calling -[super dealloc] ■ You only deal with alloc, copy, retain, release Tuesday, January 12, 2010 29
  86. 86. Object Ownership #import <Foundation/Foundation.h> @interface Person : NSObject { // instance variables NSString *name; // Person class “owns” the name int age; } // method declarations - (NSString *)name; - (void)setName:(NSString *)value; - (int)age; - (void)setAge:(int)age; - (BOOL)canLegallyVote; - (void)castBallot; @end Tuesday, January 12, 2010 30
  87. 87. Object Ownership #import "Person.h" @implementation Person @end Tuesday, January 12, 2010 31
  88. 88. Object Ownership #import "Person.h" @implementation Person - (NSString *)name { return name; } - (void)setName:(NSString *)newName { } @end Tuesday, January 12, 2010 31
  89. 89. Object Ownership #import "Person.h" @implementation Person - (NSString *)name { return name; } - (void)setName:(NSString *)newName { if (name != newName) { [name release]; name = [newName retain]; // name’s retain count has been bumped up by 1 } } @end Tuesday, January 12, 2010 31
  90. 90. Object Ownership #import "Person.h" @implementation Person - (NSString *)name { return name; } - (void)setName:(NSString *)newName { } @end Tuesday, January 12, 2010 31
  91. 91. Object Ownership #import "Person.h" @implementation Person - (NSString *)name { return name; } - (void)setName:(NSString *)newName { if (name != newName) { [name release]; name = [newName copy]; // name has retain count of 1, we own it } } @end Tuesday, January 12, 2010 31
  92. 92. Releasing Instance Variables #import "Person.h" @implementation Person @end Tuesday, January 12, 2010 32
  93. 93. Releasing Instance Variables #import "Person.h" @implementation Person - (void)dealloc { } @end Tuesday, January 12, 2010 32
  94. 94. Releasing Instance Variables #import "Person.h" @implementation Person - (void)dealloc { // Do any cleanup that’s necessary [name release]; } @end Tuesday, January 12, 2010 32
  95. 95. Releasing Instance Variables #import "Person.h" @implementation Person - (void)dealloc { // Do any cleanup that’s necessary [name release]; // when we’re done, call super to clean us up [super dealloc]; } @end Tuesday, January 12, 2010 32
  96. 96. Autorelease Tuesday, January 12, 2010 33
  97. 97. Returning a newly created object - (NSString *)fullName { NSString *result; result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName]; return result; } Tuesday, January 12, 2010 34
  98. 98. Returning a newly created object - (NSString *)fullName { NSString *result; result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName]; return result; } Wrong: result is leaked! Tuesday, January 12, 2010 34
  99. 99. Returning a newly created object - (NSString *)fullName { NSString *result; result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName]; [result release]; return result; } Tuesday, January 12, 2010 34
  100. 100. Returning a newly created object - (NSString *)fullName { NSString *result; result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName]; [result release]; return result; } Wrong: result is released too early! Method returns bogus value Tuesday, January 12, 2010 34
  101. 101. Returning a newly created object - (NSString *)fullName { NSString *result; result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName]; return result; } Tuesday, January 12, 2010 34
  102. 102. Returning a newly created object - (NSString *)fullName { NSString *result; result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName]; [result autorelease]; return result; } Tuesday, January 12, 2010 34
  103. 103. Returning a newly created object - (NSString *)fullName { NSString *result; result = [[NSString alloc] initWithFormat:@“%@ %@”, firstName, lastName]; [result autorelease]; return result; } Just right: result is released, but not right away Caller gets valid object and could retain if needed Tuesday, January 12, 2010 34
  104. 104. Autoreleasing Objects • Calling -autorelease flags an object to be sent release at some point in the future • Let’s you fulfill your retain/release obligations while allowing an object some additional time to live • Makes it much more convenient to manage memory • Very useful in methods which return a newly created object Tuesday, January 12, 2010 35
  105. 105. Method Names & Autorelease Tuesday, January 12, 2010 36
  106. 106. Method Names & Autorelease • Methods whose names includes alloc, copy, or new return a retained object that the caller needs to release Tuesday, January 12, 2010 36
  107. 107. Method Names & Autorelease • Methods whose names includes alloc, copy, or new return a retained object that the caller needs to release NSMutableString *string = [[NSMutableString alloc] init]; // We are responsible for calling -release or -autorelease [string autorelease]; Tuesday, January 12, 2010 36
  108. 108. Method Names & Autorelease • Methods whose names includes alloc, copy, or new return a retained object that the caller needs to release NSMutableString *string = [[NSMutableString alloc] init]; // We are responsible for calling -release or -autorelease [string autorelease]; • All other methods return autoreleased objects Tuesday, January 12, 2010 36
  109. 109. Method Names & Autorelease • Methods whose names includes alloc, copy, or new return a retained object that the caller needs to release NSMutableString *string = [[NSMutableString alloc] init]; // We are responsible for calling -release or -autorelease [string autorelease]; • All other methods return autoreleased objects NSMutableString *string = [NSMutableString string]; // The method name doesn’t indicate that we need to release it // So don’t- we’re cool! Tuesday, January 12, 2010 36
  110. 110. Method Names & Autorelease • Methods whose names includes alloc, copy, or new return a retained object that the caller needs to release NSMutableString *string = [[NSMutableString alloc] init]; // We are responsible for calling -release or -autorelease [string autorelease]; • All other methods return autoreleased objects NSMutableString *string = [NSMutableString string]; // The method name doesn’t indicate that we need to release it // So don’t- we’re cool! • This is a convention- follow it in methods you define! Tuesday, January 12, 2010 36
  111. 111. How does -autorelease work? Tuesday, January 12, 2010 37
  112. 112. How does -autorelease work? • Object is added to current autorelease pool Tuesday, January 12, 2010 37
  113. 113. How does -autorelease work? • Object is added to current autorelease pool • Autorelease pools track objects scheduled to be released ■ When the pool itself is released, it sends -release to all its objects Tuesday, January 12, 2010 37
  114. 114. How does -autorelease work? • Object is added to current autorelease pool • Autorelease pools track objects scheduled to be released ■ When the pool itself is released, it sends -release to all its objects • UIKit automatically wraps a pool around every event dispatch Tuesday, January 12, 2010 37
  115. 115. Autorelease Pools (in pictures) pp d ha lize nib nt en t pp nc ia i n ve v it a au nit a ore lee Ex L pi a dm it f nd Ap Lo Wa Ha Tuesday, January 12, 2010 38
  116. 116. Autorelease Pools (in pictures) Pool Pool created pp d ha lize nib nt en t pp nc ia i n ve v it a au nit a ore lee Ex L pi a dm it f nd Ap Lo Wa Ha Tuesday, January 12, 2010 38
  117. 117. Autorelease Pools (in pictures) Pool Objects autoreleased here go into pool Pool created pp d ha lize nib nt en t pp nc ia i n ve v it a au nit a ore lee Ex L pi a dm it f nd Ap Lo Wa Ha Tuesday, January 12, 2010 38
  118. 118. Autorelease Pools (in pictures) Pool Objects autoreleased here go into pool Pool created pp d ha lize nib nt en t pp nc ia i n ve v it a au nit a ore lee Ex L pi a dm it f nd Ap Lo Wa Ha Tuesday, January 12, 2010 38
  119. 119. Autorelease Pools (in pictures) Pool Objects autoreleased here go into pool [object autorelease]; Pool created pp d ha lize nib nt en t pp nc ia i n ve v it a au nit a ore lee Ex L pi a dm it f nd Ap Lo Wa Ha Tuesday, January 12, 2010 38
  120. 120. Autorelease Pools (in pictures) Pool Objects autoreleased here go into pool Pool created pp d ha lize nib nt en t pp nc ia i n ve v it a au nit a ore lee Ex L pi a dm it f nd Ap Lo Wa Ha Tuesday, January 12, 2010 38
  121. 121. Autorelease Pools (in pictures) Pool Objects autoreleased here go into pool Pool created pp d ha lize nib nt en t pp nc ia i n ve v it a au nit a ore lee Ex L pi a dm it f nd Ap Lo Wa Ha Tuesday, January 12, 2010 38
  122. 122. Autorelease Pools (in pictures) Pool Objects autoreleased here go into pool Pool released Pool created pp d ha lize nib nt en t pp nc ia i n ve v it a au nit a ore lee Ex L pi a dm it f nd Ap Lo Wa Ha Tuesday, January 12, 2010 38
  123. 123. Autorelease Pools (in pictures) [object release]; Pool [object release]; Objects autoreleased here go into pool [object release]; Pool released Pool created pp d ha lize nib nt en t pp nc ia i n ve v it a au nit a ore lee Ex L pi a dm it f nd Ap Lo Wa Ha Tuesday, January 12, 2010 38
  124. 124. Autorelease Pools (in pictures) Pool Objects autoreleased here go into pool Pool released Pool created pp d ha lize nib nt en t pp nc ia i n ve v it a au nit a ore lee Ex L pi a dm it f nd Ap Lo Wa Ha Tuesday, January 12, 2010 38
  125. 125. Hanging Onto an Autoreleased Object • Many methods return autoreleased objects ■ Remember the naming conventions... ■ They’re hanging out in the pool and will get released later • If you need to hold onto those objects you need to retain them ■ Bumps up the retain count before the release happens Tuesday, January 12, 2010 39
  126. 126. Hanging Onto an Autoreleased Object • Many methods return autoreleased objects ■ Remember the naming conventions... ■ They’re hanging out in the pool and will get released later • If you need to hold onto those objects you need to retain them ■ Bumps up the retain count before the release happens name = [NSMutableString string]; // We want to name to remain valid! [name retain]; // ... // Eventually, we’ll release it (maybe in our -dealloc?) [name release]; Tuesday, January 12, 2010 39
  127. 127. Side Note: Garbage Collection • Autorelease is not garbage collection • Objective-C on iPhone OS does not have garbage collection Tuesday, January 12, 2010 40
  128. 128. Objective-C Properties Tuesday, January 12, 2010 41
  129. 129. Properties • Provide access to object attributes • Shortcut to implementing getter/setter methods • Also allow you to specify: ■ read-only versus read-write access ■ memory management policy Tuesday, January 12, 2010 42
  130. 130. Defining Properties #import <Foundation/Foundation.h> @interface Person : NSObject { // instance variables NSString *name; int age; } // method declarations - (NSString *) name; - (void)setName:(NSString *)value; - (int) age; - (void)setAge:(int)age; - (BOOL) canLegallyVote; - (void)castBallot; @end Tuesday, January 12, 2010 43
  131. 131. Defining Properties #import <Foundation/Foundation.h> @interface Person : NSObject { // instance variables NSString *name; int age; } // method declarations - (NSString *) name; - (void)setName:(NSString *)value; - (int) age; - (void)setAge:(int)age; - (BOOL) canLegallyVote; - (void)castBallot; @end Tuesday, January 12, 2010 43
  132. 132. Defining Properties #import <Foundation/Foundation.h> @interface Person : NSObject { // instance variables NSString *name; int age; } // method declarations - (NSString *) name; - (void)setName:(NSString *)value; - (int) age; - (void)setAge:(int)age; - (BOOL) canLegallyVote; - (void)castBallot; @end Tuesday, January 12, 2010 43
  133. 133. Defining Properties #import <Foundation/Foundation.h> @interface Person : NSObject { // instance variables NSString *name; int age; } // property declarations @property int age ; @property (copy) NSString * name; @property (readonly) BOOL canLegallyVote ; - (void)castBallot; @end Tuesday, January 12, 2010 43
  134. 134. Defining Properties #import <Foundation/Foundation.h> @interface Person : NSObject { // instance variables NSString *name; int age; } // property declarations @property int age; @property (copy) NSString *name; @property (readonly) BOOL canLegallyVote; - (void)castBallot; @end Tuesday, January 12, 2010 44
  135. 135. Synthesizing Properties @implementation Person - (int)age { return age; } - (void)setAge:(int)value { age = value; } - (NSString *)name { return name; } - (void)setName:(NSString *)value { if (value != name) { [name release]; name = [value copy]; } } - (void)canLegallyVote { ... Tuesday, January 12, 2010 45
  136. 136. Synthesizing Properties @implementation Person - (int)age { return age; } - (void)setAge:(int)value { age = value; } - (NSString *)name { return name; } - (void)setName:(NSString *)value { if (value != name) { [name release]; name = [value copy]; } } - (void)canLegallyVote { ... Tuesday, January 12, 2010 45
  137. 137. Synthesizing Properties @implementation Person - (int)age { age return age; } - (void)setAge:(int)value { age = value; } - (NSString *)name { name return name; } - (void)setName:(NSString *)value { if (value != name) { [name release]; name = [value copy]; } } - (void)canLegallyVote { ... Tuesday, January 12, 2010 45
  138. 138. Synthesizing Properties @implementation Person @synthesize age; @synthesize name; - (BOOL)canLegallyVote { return (age > 17); } @end Tuesday, January 12, 2010 46
  139. 139. Property Attributes • Read-only versus read-write ! @property int age; // read-write by default @property (readonly) BOOL canLegallyVote; • Memory management policies (only for object properties) @property (assign) NSString *name; // pointer assignment @property (retain) NSString *name; // retain called @property (copy) NSString *name; // copy called Tuesday, January 12, 2010 47
  140. 140. Property Names vs. Instance Variables • Property name can be different than instance variable @interface Person : NSObject { int numberOfYearsOld; } @property int age; @end Tuesday, January 12, 2010 48
  141. 141. Property Names vs. Instance Variables • Property name can be different than instance variable @interface Person : NSObject { int numberOfYearsOld; } @property int age; @end @implementation Person @synthesize age = numberOfYearsOld; @end Tuesday, January 12, 2010 48
  142. 142. Properties • Mix and match synthesized and implemented properties @implementation Person @synthesize age; @synthesize name; - (void)setAge:(int)value { age = value; // now do something with the new age value... } @end • Setter method explicitly implemented • Getter method still synthesized Tuesday, January 12, 2010 49
  143. 143. Properties In Practice • Newer APIs use @property • Older APIs use getter/setter methods • Properties used heavily throughout UIKit APIs ■ Not so much with Foundation APIs • You can use either approach ■ Properties mean writing less code, but “magic” can sometimes be non-obvious Tuesday, January 12, 2010 50
  144. 144. Dot Syntax and self • When used in custom methods, be careful with dot syntax for properties defined in your class • References to properties and ivars behave very differently @interface Person : NSObject { NSString *name; } @property (copy) NSString *name; @end Tuesday, January 12, 2010 51
  145. 145. Dot Syntax and self • When used in custom methods, be careful with dot syntax for properties defined in your class • References to properties and ivars behave very differently @interface Person : NSObject { NSString *name; } @property (copy) NSString *name; @end @implementation Person - (void)doSomething { name = @“Fred”; // accesses ivar directly! self.name = @“Fred”; // calls accessor method } Tuesday, January 12, 2010 51
  146. 146. Common Pitfall with Dot Syntax What will happen when this code executes? @implementation Person - (void)setAge:(int)newAge { self.age = newAge; } @end Tuesday, January 12, 2010 52
  147. 147. Common Pitfall with Dot Syntax What will happen when this code executes? @implementation Person - (void)setAge:(int)newAge { self.age = newAge; } @end This is equivalent to: @implementation Person - (void)setAge:(int)newAge { [self setAge:newAge]; // Infinite loop! } @end Tuesday, January 12, 2010 52
  148. 148. Further Reading • Objective-C 2.0 Programming Language ■ “Defining a Class” ■ “Declared Properties” • Memory Management Programming Guide for Cocoa Tuesday, January 12, 2010 53
  149. 149. Questions? Tuesday, January 12, 2010 54

×