Introduction to objective c

  • 314 views
Uploaded on

 

More in: Technology , Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
314
On Slideshare
0
From Embeds
0
Number of Embeds
3

Actions

Shares
Downloads
12
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Introduc)on  to  Objec)ve-­‐C   Jussi  Pohjolainen   Tampere  University  of  Applied  Sciences  
  • 2. QUICKSTART  
  • 3. Background   •  Objec)ve-­‐C  is  layered  on  top  of  the  C  –   language   – Based  on  SmallTalk-­‐80   – Designed  in  early  1980s   •  NeXT  SoLware  licensed  Objec)ve-­‐C  in  1988   •  Apple  Computer  acquired  NeXT  in  1996   •  Today:  na)ve  language  for  developing  Mac  OS   X  -­‐  and  iPhone  -­‐  apps  
  • 4. Class  Declara)on:  MyPoint.h
  • 5. Class  Implementa)on:  MyPoint.m
  • 6. Test  the  Class:  main.m
  • 7. Simple  makefile   MyPoint : MyPoint.m main.m clang -fno-objc-arc -framework foundation MyPoint.m main.m -o MyPoint run : ./MyPoint clean : rm MyPoint
  • 8. Compiling  and  Running   TB308POHJUS-L-2:point pohjus$ ls -al total 32 drwxr-xr-x 6 pohjus staff 204 18 Tou 15:32 . drwxr-xr-x 3 pohjus staff 102 18 Tou 14:52 .. -rw-r--r--@ 1 pohjus staff 196 18 Tou 15:25 MyPoint.h -rw-r--r--@ 1 pohjus staff 268 18 Tou 15:23 MyPoint.m -rw-r--r--@ 1 pohjus staff 339 18 Tou 15:25 main.m -rw-r--r--@ 1 pohjus staff 120 18 Tou 15:14 makefile TB308POHJUS-L-2:point pohjus$ make clang -fno-objc-arc -framework foundation MyPoint.m main.m -o MyPoint TB308POHJUS-L-2:point pohjus$ make run ./MyPoint 2009-05-18 15:32:46.339 MyPoint[8725:807] X = 0 and Y = 0 2009-05-18 15:32:46.341 MyPoint[8725:807] X = 8 and Y = 7 TB308POHJUS-L-2:point pohjus$
  • 9. Instan)a)ng  an  Object   // Declare a pointer to the object MyPoint* point; // Allocate memory for the object point = [MyPoint alloc]; // Initialize the object point = [point init];
  • 10. Instan)a)ng  an  Object:  One  Liner   // Allocate and initialize the object MyPoint* point1 = [[MyPoint alloc] init];
  • 11. Messages  (Methods)   - (void) setX: (int) n;! method  type:   +  =  class  method   -­‐  =  object  method   return  type   selector  name     argument  type     argument   name    
  • 12. Messages,  with  Two  Arguments   Declara=on   - (void) setXAndY: (int) x: (int) y Usage   [object setXAndY: 5: 6]; Declara=on,  be@er  way   - (void) setX: (int) x andY: (int) y Usage   [object setX: 5 andY: 6];
  • 13. EXERCISES  
  • 14. MEMORY  MANAGEMENT  AND  OBJECT   LIFECYCLE    
  • 15. Memory  Handling  in  General   •  When  allocate  something  it  must  be  released   – Memory  consump)on   •  In  Java,  garbage  collector  takes  care  of  the   release.  Separate  thread  looking  for  objects   that  can  be  released   •  In  Obj-­‐C  and  C/C++,  programmer  is   responsible  about  the  release.  
  • 16. About  Pointers   •  int  a  =  5;   – Holds  one  integer  value   – The  integer  is  stored  in  some  memory  address   •  Where?   – You  can  get  the  memory  address  by  using  &  in   front  of  the  variable:  &a  
  • 17. Example  of  Memory  Address   int main(int argc, char *argv[]) { int a = 5; // prints 5 NSLog(@"%i", a); // prints something like 0x7fff5fbff9cc NSLog(@"%p", &a); return 0; }
  • 18. Pointers   •  Pointer  is  a  variable  that  stores  memory   address   •  int  a;   – holds  integer  variable   •  int*  b;   – holds  memory  address  that  points  to  integer  value   •  int*  b  =  &a;   – Now  b  has  the  memory  address  of  a  
  • 19. Example  about  Pointers   #import "MyPoint.h" int main(int argc, char *argv[]) { int a = 5; // Store a's memory address to variable b int *b = &a; // prints 5 NSLog(@"%i", a); // prints something like 0x7fff5fbff9cc NSLog(@"%p", &a); // prints something like 0x7fff5fbff9cc NSLog(@"%p", b); // prints 5 NSLog(@"%i", *b); return 0; }
  • 20. What  is  the  result  now?   int main(int argc, char *argv[]) { int a = 5; // Store a's memory address to variable b int *b = &a; if(b == &a) { NSLog(@"Do we go here?"); } if(*b == a) { NSLog(@"What about here?"); } return 0; }
  • 21. What  is  the  result  now?   int main(int argc, char *argv[]) { int a = 5; int *b = &a; *b = 10; NSLog(@"%i", a); return 0; }
  • 22. Memory  Areas   •  Memory  can  be  divided  into  three  categories   1.  Global  or  sta)c   2.  Stack   3.  Heap  
  • 23. Sta)c   •  When  something  is  in  sta)c  memory,  it's  there   all  the  )me  when  app  is  running   •  So  when  star)ng  the  app,  the  memory  is   allocated  an  when  the  app  closes,  the  memory   is  deallocated   •  The  variable  is  stored  in  the  same  memory   address  all  the  )me.  
  • 24. Example  of  Sta)c  Memory   int thisIsStoredInStaticMemory = 5; int main(int argc, char *argv[]) { static int thisIsAlsoStoredInStaticMemory = 10; NSLog(@"My number = %i", thisIsStoredInStaticMemory); NSLog(@"My number = %i", thisIsAlsoStoredInStaticMemory); return 0; }
  • 25. Stack  -­‐  Memory   •  Stack  –  memoryarea  is  usually  small   •  If  you  put  too  much  "stuff"  into  stack,  you   might  get  stack  overflow   •  Local  variables  are  stored  in  stack!   •  Variables  are  released  when  out  of  scope  
  • 26. Example  of  Stack  Memory   int main(int argc, char *argv[]) { int stack1 = 3; NSLog(@"My number = %i", stack1); if(YES) { int stack2 = 4; NSLog(@"My number = %i", stack2); // stack2 is released from memory now. } // stack1 is released from memory now. return 0; }
  • 27. Example  of  Stack  Memory   int main(int argc, char *argv[]) { if(YES) { int stack2 = 4; } // Does this work? NSLog(@"My number = %i", stack2); return 0; }
  • 28. Heap  -­‐  Memory   •  Heap  –  memory  is  the  large  memory  area   where  almost  all  of  the  objects  go.   •  Programmer  is  responsible  for  releasing  the   objects!    
  • 29. Example  of  Heap  -­‐  memory   #import "MyPoint.h" int main(int argc, char *argv[]) { MyPoint* point = [MyPoint alloc]; //... [point release]; return 0; }
  • 30. Crea)ng  a  Object   •  The  crea)on  of  an  object  is  done  in  two  parts   •  1)  Alloca)ng  memory   –  MyPoint* point = [MyPoint alloc]; •  2)  Ini)alize  object  state   –  point = [point init]; •  Combined   –  MyPoint* point = [[MyPoint alloc] init]; •  ó   –  MyPoint* point = [MyPoint new];
  • 31. What  happens  in  Memory?   •  What  happens  in  here?   – MyPoint* p = [MyPoint alloc]; •  Two  things!   – MyPoint* p; – p = [MyPoint alloc]; •  p  is  in  stack  –  memory!   •  MyPoint  object  is  in  heap  memory!  
  • 32. Problem?   #import "MyPoint.h" int main(int argc, char *argv[]) { if(YES) { MyPoint* point = [MyPoint alloc]; } [point release]; return 0; }
  • 33. Problem?   #import "MyPoint.h" int main(int argc, char *argv[]) { MyPoint* point = [MyPoint alloc]; point = [MyPoint alloc]; [point release]; return 0; }
  • 34. init-­‐method?   •  init-­‐method  is  implemented  in  NSObject •  You  can  however  implement  your  own  init-­‐ method   - (id) initWithName: (NSString*) aName { if(self = [super init]) { name = aName; } return self; }
  • 35. Other  init-­‐methods   •  Like  in  Java  and  C++,  one  can  have  mul)ple   constructors   •  In  Obj-­‐C,  one  can  have  mul)ple  init-­‐methods   -  (id) init -  (id) initWithX: (int) aX; -  (id) initWithX: (int) aX andY: (int) aY
  • 36. Deallocing  Object  and  Reference  Count   •  Rules  about  reference  coun=ng   –  When  object  is  created  its  reference  count  is  set  to  1   –  Incremen)ng  the  reference  count:   •  [point retain]; –  Decreasing  reference  count   •  [point release]; –  When  reference  count  reaches  to  0,  dealloca=ng  occurs   •  ARC  will  save  you  from  this!  
  • 37. Reference  Count  Example   #import <Foundation/Foundation.h> @interface Cat : NSObject { } - (void) printMyRetainCount; @end @implementation Cat - (void) printMyRetainCount { NSLog(@"Retain count = %i", [self retainCount]); } @end
  • 38. Reference  Count  Example   int main(int argc, char *argv[]) { Cat* myCat = [[Cat alloc] init]; [myCat printMyRetainCount]; // Retain count = 1 Cat* reference = myCat; [reference retain]; [myCat printMyRetainCount]; // Retain count = 2 [myCat release]; [myCat printMyRetainCount]; // Retain count = 1 [myCat release]; // Deallocation return 0; }
  • 39. dealloc •  You  can  implement  a  dealloc  method   (void) dealloc { // Some code [super dealloc]; }
  • 40. Reference  Count  Example   #import <Foundation/Foundation.h> @interface Cat : NSObject { NSString* name; } - (void) setName: (NSString *) theName @end @implementation Cat - (void) setName: (NSString *) theName { name = theName; } @end int main(int argc, char *argv[]) { .... Cat* mirri = [[Cat alloc] init]; [mirri setName: someName]; // What happens now? [someName release]; } Since  reference  count  is   0,  dealloca)on  occurs.   This  means,  that  the  Cat   does  not  have  a  name   anymore.  
  • 41. Reference  Count  Example   #import <Foundation/Foundation.h> @interface Cat : NSObject { NSString* name; } - (void) setName: (NSString *) theName @end @implementation Cat - (void) setName: (NSString *) theName { [name release]; name = theName; [name retain]; } @end int main(int argc, char *argv[]) { .... Cat* mirri = [[Cat alloc] init]; [mirri setName: someName]; // What happens now? [someName release]; } Since  reference  count  is   1,  dealloca)on  does  not   occur  and  the  Cat  s)ll   has  it's  name.  
  • 42. Copying  a  Object   - (void)setName:(NSString *)theName } [name release]; name = [theName copy]; }
  • 43. Autorelease  Pool   •  Every  Founda)on  program  must  set  up   autorelease  pool  for  the  Founda)on  objects   •  Pool  keeps  track  of  your  objects  for  later   release   –  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; –  ... –  [pool drain];
  • 44. Method  Names   •  If  method  name  includes  alloc  or  copy,  it   returns  a  object  that  must  be  released   –  // Must be released –  NSObject* object = [[NSObject alloc] init]; –  // Must be released –  NSObject* copy = [object copy]; –  // Do not have to release –  NSMutableString* string = [NSMutableString string]; •  The  above  string  is  released  in  Autorelease  Pool!
  • 45. Problem   // Programmer A code [[someObject giveCat] eat]; // Programmer B code - (Cat*) giveCat { // Must be released! Cat* myCat = [[Cat alloc] init]; // But where? Should the programmer who calls this method be // responsible for deallocation of the Cat? How does the programmer // know this? return myCat; } ..
  • 46. Solu)on   // Programmer A code [[someObject giveCat] eat]; // Programmer B code - (Cat*) giveCat { // Must be released! Cat* myCat = [[Cat alloc] init]; // But where? When autopool is drained! [myCat autorelease]; return myCat; }
  • 47. Delayed  Release   •  Autorelease  means  "send  release  message   later".   •  Release  message  is  sent  when  Autorelease   Pool  is  released   •  Autorelease  Pool  is  created  and  released  in   UIKit  programs  automa=cally!   – Pool  is  created  at  the  beginning  of  an  event  cycle   – Pool  is  released  at  the  end  of  an  event  cycle  
  • 48. Autorelease  Pools   App  Loaded   Wait  for  Event   Handle  event   Exit  app   Event  loop   Pool   created   Pool   released  
  • 49. Autorelease  Pool  Usage   // Method - (Cat*) giveCat { // Must be released! Cat* myCat = [[Cat alloc] init]; // But where? When autopool is drained! [myCat autorelease]; return myCat; } // Usage Cat* someCat = [object giveCat]; // someCat will be released in some time, so if you want to hold it, use // retain [someCat retain];
  • 50. Rules   •  If  method  name  contains  "alloc",  "new"  or   "copy",  you  must  remember  to  use  release or  autorelease – Example:  alloc, newObject, mutableCopy •  If  you  retain something,  you  must  use   release or  autorelease •  Instance  Variables:  retain  or  copy   •  autorelease  means  "send  release later"  
  • 51. Cat.h   #import <Foundation/Foundation.h> @interface Cat : NSObject { @private NSString* name; } - (id) initWithName: (NSString*) aName; - (void) setName: (NSString*) aName; - (NSString*) getName; - (void) dealloc; @end
  • 52. Cat.m   #import "Cat.h" @implementation Cat - (id) initWithName: (NSString*) aName { if(self = [super init]) { [self setName: aName]; } return self; } - (NSString*) getName { return name; } - (void) setName: (NSString*) aName { if(aName != name) { [name release]; name = aName; [name retain]; } } - (void) dealloc { [name release]; [super dealloc]; } @end
  • 53. main.m   #import "Cat.h" int main(int argc, char *argv[]) { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // Create the string NSString* catName = [[NSString alloc] initWithString: @"Jack"]; // Create cat with the string Cat* cat = [[Cat alloc] initWithName: catName]; // Just testing. This does not deallocate catName! [catName release]; // Get the name NSString* name = [cat getName]; // Print the name NSLog(name); // Release name and cat [cat release]; [pool drain]; return 0; }  
  • 54. MANAGING  MEMORY  WITH  ARC   ARC  to  the  rescue!  
  • 55. ARC?   •  ARC  (Automa=c  Reference  Coun=ng)   – Compiler  does  automa/c  reference  coun/ng  by   examining  the  source  code  and  then  add  the   retain  and  release  messages  to  objects   •  Not  garbage  collec)on,  no  background   process  of  dealloca)on  of  objects!   •  Inserts  retain  and  release  statements  based   on  some  fixed  rules   •  OS  X  10.7  and  iOS  5  for  all  features  
  • 56. Object  lose  owners   // Scenario 1 Person* jack = [[Person alloc] init]; jack = [[Person alloc] init]; // Scenario 2 Person* tina = [[Person alloc] init]; tina = nil; // Scenario 3 if(yes) { Person* dave = [[Person alloc] init]; }
  • 57. Some  Fixed  rules   •  If  object  is  allocated  and  local  to  method,   release  statement  is  added  near  the  end  of   that  method   •  If  allocated  object  is  class  a@ribute,  release  is   added  to  dealloc   •  If  the  object  is  return  value,  it  gets  an   autorelease  statement  
  • 58. Guidelines   •  Don’t  call!   – retain, release, retainCount, autorelease or dealloc •  You  must  use  @autoreleasepool  syntax   •  You  must  enable  ARC   – clang -fobjc-arc -framework foundation Car.m Motor.m main.m -o App
  • 59. makefile   MyPoint : Car.m Motor.m main.m clang -fobjc-arc -framework foundation Car.m Motor.m main.m -o App run : ./App clean : rm App
  • 60. main.m  
  • 61. motor.h  
  • 62. motor.m  
  • 63. car.h  
  • 64. car.m  
  • 65. PROPERTIES  
  • 66. Objec)ve-­‐C  2.0:  @property
  • 67. Objec)ve-­‐C  2.0:  @synthesize
  • 68. Objec)ve-­‐C  2.0:  Dot  Syntax  
  • 69. Autosynthesize  
  • 70. Autosynthesize  
  • 71. Property  Declara)on  Aoributes:   Writability   •  You  can  decorate  a  property  with  aoributes,   example:   – @property (readonly) int x; •  readwrite – Indicates  that  the  property  is  read/write.  Default   •  readonly – Only  read   – Generates  only  geoer  method  
  • 72. Seoer  Seman)cs   •  assign –  Simple  seoer.  Default.   •  weak –  Non-­‐owning  rela)onship  with  an  object   –  If  object  is  deallocated,  the  property  is  set  to  nil   •  strong –  Owning  rela)onship  with  an  object   •  copy –  Specifies  that  a  copy  of  the  object  should  be  used  for   assignment  
  • 73. Seoer  Seman)cs  Examples   // assign property = newValue; // copy if (property != newValue) { [property release]; property = [newValue copy]; }
  • 74. Atomicity   •  nonatomic – Specifies  that  accessor  are  non-­‐atomic.     •  Proper)es  are  atomic  by  default:   – [_internal lock]; – id result = [[value retain] autorelease]; – [_internal unlock]; – return id;
  • 75. Car.h  
  • 76. Motor.h  
  • 77. Main.m  
  • 78. Change!  Car.h  
  • 79. STRINGS  
  • 80. About  Strings   •  C  String   – char * // Array of characters •  NSString – Object,  that  holds  array  of  Unicode  characters   – Is  immutable,  contents  cannot  be  changed   aLerwards!   •  NSMutableString – String  that  can  be  modified  aLerwards  
  • 81. Crea)ng  Strings   // Simple way NSString *temp1 = @"Hello World!"; // Appending, notice that this produces new string NSString *beginning = @"beginning"; NSString *alphaAndOmega = [beginning stringByAppendingString:@" and end"];
  • 82. Formapng   •  Formapng   –  NSString *string1 = [NSString stringWithFormat:@"A string: %@, a float: %1.2f", @"string", 31415.9265]; –  // string1 is "A string: string, a float: 31415.93" •  Format  Specifiers?   – http://developer.apple.com/iphone/ library/documentation/Cocoa/Conceptual/ Strings/Articles/formatSpecifiers.html#// apple_ref/doc/uid/TP40004265-SW1
  • 83. NSString  methods   •  See:   – http://developer.apple.com/documentation/ Cocoa/Reference/Foundation/Classes/ NSString_Class/Reference/NSString.html
  • 84. NSMutableString methods   •  NSMutableString inherites  NSString •  With  NSMutableString you  can  modify  the   string  with  these  methods   – appendFormat: – appendString: – deleteCharactersInRange: – insertString:atIndex: – replaceCharactersInRange:withString: – replaceOccurrencesOfString:withString:options:range: – setString:
  • 85. PROTOCOLS  
  • 86. Protocols?   •  Compared  to  Java,  protocols  are  interfaces   •  You  define  methods  that  some  object  must   implement      
  • 87. Using  Protocols   // MyProtocolName.h // Notice that the protocol inherites NSObject // protocol! @protocol MyProtocolName <NSObject> //Method declarations go here @end // MyObject @interface Class: NSObject <MyProtocolName>  
  • 88. Protocol  as  Variable   •  In  Java   –  MyInterface object = new MyObject(); •  In  Obj-­‐C   –  id<MyProtocolName> object = [[MyObject alloc] init]; •  As  a  method  argument   –  (void) doSomethingWithThisObject: (id<MyProtocolName>) aObject •  ID  is  a  predefined  pointer  type  for  an  arbitrary   object    
  • 89. FOUNDATION  CLASSES  
  • 90. NSObject   •  NSObject  is  the  root  class  of  Most  Obj-­‐C   classes   •  Crea)ng,  copying,  dealloca)ng  objects    
  • 91. Collec)ons   •  Array:  Ordered  Collec/ons   •  Dic)onary:  Collec/ons  of  Keys  and  Values   •  Set:  Unordered  Collec/ons  of  Objects   •  Counted  Sets:  Unordered  Collec/on  of   Indis/nct  Objects   •  Enumera)on:  Traversing  a  Collec/on's   Elements   •  Mutable  and  immutable  versions!  
  • 92. Other  Classes   •  NSNumber,  wrapper  for  standard  number   types   •  NSDate,  NSCalendarDate