Objective-C for Java Developers

27,112 views

Published on

Objective-C for Java Developers presentation given to the TCJUG on 10/9/2010 by Bob McCune.

Published in: Technology
6 Comments
49 Likes
Statistics
Notes
  • Objective-C Programming: The Big Nerd Ranch Guide (2nd Edition) (Big Nerd Ranch Guides) --- http://amzn.to/1R982Rx
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Objective C: Crash Course - The Ultimate Beginner's Course to Learning Objective C Programming in Under 12 Hours --- http://amzn.to/1T2JKuO
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Programming in Objective-C (6th Edition) (Developer's Library) --- http://amzn.to/21Bvido
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Too bad it's not updated for ARC, subscripting and other modern Objective-C features.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Thank you.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
27,112
On SlideShare
0
From Embeds
0
Number of Embeds
7,189
Actions
Shares
0
Downloads
747
Comments
6
Likes
49
Embeds 0
No embeds

No notes for slide

Objective-C for Java Developers

  1. 1. Objective-C for Java Developers http://bobmccune.com Tuesday, August 10, 2010
  2. 2. Objective-C Overview Tuesday, August 10, 2010
  3. 3. Objective-C The old new hotness • Strict superset of ANSI C • Object-oriented extensions • Additional syntax and types • Native Mac & iOS development language • Flexible typing • Simple, expressive syntax • Dynamic runtime Tuesday, August 10, 2010
  4. 4. Why Use Objective-C? No Java love from Apple? • Key to developing for Mac & iOS platforms • Performance • Continually optimized runtime environment • Can optimize down to C as needed • Memory Management • Dynamic languages provide greater flexibility • Cocoa APIs rely heavily on these features Tuesday, August 10, 2010
  5. 5. Java Developer’s Concerns Ugh, didn’t Java solve all of this stuff • Pointers • Memory Management • Preprocessing & Linking • No Namespaces • Prefixes used to avoid collisions • Common Prefixes: NS, UI, CA, MK, etc. Tuesday, August 10, 2010
  6. 6. Creating Classes Tuesday, August 10, 2010
  7. 7. Classes • Classes define the blueprint for objects. • Objective-C class definitions are separated into an interface and an implementation. • Usually defined in separate .h and .m files •Defines the •Defines the actual programming implementation interface code •Defines the •Defines one or object's instance more initializers variable to properly initialize and object instance Tuesday, August 10, 2010
  8. 8. Defining the class interface @interface BankAccount : NSObject { float accountBalance; NSString *accountNumber; } - (float)withDraw:(float)amount; - (void)deposit:(float)amount; @end Tuesday, August 10, 2010
  9. 9. Defining the class interface @interface BankAccount : NSObject { float accountBalance; NSString *accountNumber; } - (float)withDraw:(float)amount; - (void)deposit:(float)amount; @end Tuesday, August 10, 2010
  10. 10. Defining the class interface @interface BankAccount : NSObject { float accountBalance; NSString *accountNumber; } - (float)withDraw:(float)amount; - (void)deposit:(float)amount; @end Tuesday, August 10, 2010
  11. 11. Defining the class interface @interface BankAccount : NSObject { float accountBalance; NSString *accountNumber; } - (float)withDraw:(float)amount; - (void)deposit:(float)amount; @end Tuesday, August 10, 2010
  12. 12. Defining the class interface @interface BankAccount : NSObject { float accountBalance; NSString *accountNumber; } - (float)withDraw:(float)amount; - (void)deposit:(float)amount; @end Tuesday, August 10, 2010
  13. 13. Defining the class interface @interface BankAccount : NSObject { float accountBalance; NSString *accountNumber; } - (float)withDraw:(float)amount; - (void)deposit:(float)amount; @end Tuesday, August 10, 2010
  14. 14. Defining the class implementation #import "BankAccount.h" @implementation BankAccount - (id)init { self = [super init]; return self; } - (float)withdraw:(float)amount { // calculate valid withdrawal return amount; } - (void)deposit:(float)amount { // record transaction } @end Tuesday, August 10, 2010
  15. 15. Defining the class implementation #import "BankAccount.h" @implementation BankAccount - (id)init { self = [super init]; return self; } - (float)withdraw:(float)amount { // calculate valid withdrawal return amount; } - (void)deposit:(float)amount { // record transaction } @end Tuesday, August 10, 2010
  16. 16. Defining the class implementation #import "BankAccount.h" @implementation BankAccount - (id)init { self = [super init]; return self; } - (float)withdraw:(float)amount { // calculate valid withdrawal return amount; } - (void)deposit:(float)amount { // record transaction } @end Tuesday, August 10, 2010
  17. 17. Defining the class implementation #import "BankAccount.h" @implementation BankAccount - (id)init { self = [super init]; return self; } - (float)withdraw:(float)amount { // calculate valid withdrawal return amount; } - (void)deposit:(float)amount { // record transaction } @end Tuesday, August 10, 2010
  18. 18. Working with Objects Tuesday, August 10, 2010
  19. 19. Creating Objects From blueprint to reality • No concept of constructors in Objective-C • Regular methods create new instances • Allocation and initialization are performed separately • Provides flexibility in where an object is allocated • Provides flexibility in how an object is initialized Java BankAccount account = new BankAccount(); Objective C BankAccount *account = [[BankAccount alloc] init]; Tuesday, August 10, 2010
  20. 20. Creating Objects • NSObject defines class method called alloc • Dynamically allocates memory for object • Returns new instance of receiving class BankAccount *account = [BankAccount alloc]; • NSObject defines instance method init • Implemented by subclasses to initialize instance after memory for it has been allocated • Subclasses commonly define several initializers account = [account init]; • alloc and init calls are almost always nested into single line BankAccount *account = [[BankAccount alloc] init]; Tuesday, August 10, 2010
  21. 21. Methods • Classes can define both class and instance methods • Methods are always public. • “Private” methods defined in implementation • Class methods (prefixed with +): • Define behaviors associated with class, not particular instance • No access to instance variables • Instance methods (prefixed with -) • Define behaviors specific to particular instance • Manage object state • Methods invoked by passing messages... Tuesday, August 10, 2010
  22. 22. Messages Speaking to objects • Methods are invoked by passing messages • Done indirectly. We never directly invoke methods • Messages dynamically bound to method implementations at runtime • Dispatching handled by runtime environment • Simple messages take the form: • [object message]; • Can pass one or more arguments: • [object messageWithArg1:arg1 arg2:arg2]; Tuesday, August 10, 2010
  23. 23. self and super • Methods have implicit reference to owning object called self (similar to Java’s this) • Additionally have access to superclass methods using super -(id)init { if (self = [super init]) { // do initialization } return self; } Tuesday, August 10, 2010
  24. 24. Invoking methods in Java Map person = new HashMap(); person.put("name", "Joe Smith"); String address = "123 Street"; String house = address.substring(0, 3); person.put("houseNumber", house); List children = Arrays.asList("Sue", "Tom"); person.put("children", children); Tuesday, August 10, 2010
  25. 25. Invoking methods in Objective-C NSMutableDictionary *person = [NSMutableDictionary dictionary]; [person setObject:@"Joe Smith" forKey:@"name"]; NSString *address = @"123 Street"; NSString *house = [address substringWithRange:NSMakeRange(0, 3)]; [person setObject:house forKey:@"houseNumber"]; NSArray *children = [NSArray arrayWithObjects:@"Sue", @"Tom", nil]; [person setObject:children forKey:@"children"]; Tuesday, August 10, 2010
  26. 26. Memory Management Tuesday, August 10, 2010
  27. 27. Memory Management Dude, where’s my Garbage Collection? • Garbage collection available for Mac apps (10.5+) • Use it if targeting 10.5+! • Use explicit memory management if targeting <= 10.4 • No garbage collection on iOS due to performance concerns. • Memory managed using simple reference counting mechanism: • Higher level abstraction than malloc / free • Straightforward approach, but must adhere to conventions and rules Tuesday, August 10, 2010
  28. 28. Memory Management Reference Counting • Objective-C objects are reference counted • Objects start with reference count of 1 • Increased with retain • Decreased with release, autorelease • When count equals 0, runtime invokes dealloc 1 2 1 0 alloc retain release release Tuesday, August 10, 2010
  29. 29. Memory Management Understanding the rules • Implicitly retain any object you create using: Methods starting with "alloc", "new", or contains "copy" e.g alloc, allocWithZone, newObject, mutableCopy,etc. • If you've retained it, you must release it • Many objects provide convenience methods that return an autoreleased reference. • Holding object reference from these methods does not make you the retainer • However, if you retain it you need an offsetting release or autorelease to free it Tuesday, August 10, 2010
  30. 30. retain / release / autorelease @implementation BankAccount - (NSString *)accountNumber { return [[accountNumber retain] autorelease]; } - (void)setAccountNumber:(NSString *)newNumber { if (accountNumber != newNumber) { [accountNumber release]; accountNumber = [newNumber retain]; } } - (void)dealloc { [self setAccountNumber:nil]; [super dealloc]; } @end Tuesday, August 10, 2010
  31. 31. Properties Tuesday, August 10, 2010
  32. 32. Properties Simplifying Accessors • Object-C 2.0 introduced new syntax for defining accessor code • Much less verbose, less error prone • Highly configurable • Automatically generates accessor code • Compliments existing conventions and technologies • Key-Value Coding (KVC) • Key-Value Observing (KVO) • Cocoa Bindings • Core Data Tuesday, August 10, 2010
  33. 33. Properties: Interface @property(attributes) type variable; Attribute Impacts readonly/readwrite Mutability assign/retain/copy Storage nonatomic Concurrency setter/getter API Tuesday, August 10, 2010
  34. 34. Properties: Interface @property(attributes) type variable; Attribute Impacts readonly/readwrite Mutability assign/retain/copy Storage nonatomic Concurrency setter/getter API @property(readonly) NSString *acctNumber; Tuesday, August 10, 2010
  35. 35. Properties: Interface @property(attributes) type variable; Attribute Impacts readonly/readwrite Mutability assign/retain/copy Storage nonatomic Concurrency setter/getter API @property(readwrite, copy) NSString *acctNumber; Tuesday, August 10, 2010
  36. 36. Properties: Interface @property(attributes) type variable; Attribute Impacts readonly/readwrite Mutability assign/retain/copy Storage nonatomic Concurrency setter/getter API @property(nonatomic, retain) NSDate *activeOn; Tuesday, August 10, 2010
  37. 37. Properties: Interface @property(attributes) type variable; Attribute Impacts readonly/readwrite Mutability assign/retain/copy Storage nonatomic Concurrency setter/getter API @property(readonly, getter=username) NSString *name; Tuesday, August 10, 2010
  38. 38. Properties: Interface @interface BankAccount : NSObject { NSString *accountNumber; NSDecimalNumber *balance; NSDecimalNumber *fees; BOOL accountCurrent; } @property(readwrite, copy) NSString *accountNumber; @property(readwrite, retain) NSDecimalNumber *balance; @property(readonly) NSDecimalNumber *fees; @property(getter=isCurrent) BOOL accountCurrent; @end Tuesday, August 10, 2010
  39. 39. Properties: Interface New in 10.6 @interface BankAccount : NSObject { and iOS 4 // Look ma, no more ivars } @property(readwrite, copy) NSString *accountNumber; @property(readwrite, retain) NSDecimalNumber *balance; @property(readonly) NSDecimalNumber *fees; @property(getter=isCurrent) BOOL accountCurrent; @end Tuesday, August 10, 2010
  40. 40. Properties: Implementation @implementation BankAccount @synthesize accountNumber; @synthesize balance; @synthesize fees; @synthesize accountCurrent; ... @end Tuesday, August 10, 2010
  41. 41. Properties: Implementation @implementation BankAccount New in 10.6 and iOS 4 // no more @synthesize statements ... @end Tuesday, August 10, 2010
  42. 42. Accessing Properties • Generated properties are standard methods • Accessed through normal messaging syntax [object property]; [object setProperty:(id)newValue]; • Objective-C 2.0 property access via dot syntax object.property; object.property = newValue; Dot notation is just syntactic sugar. Still uses accessor methods. Doesn't get/set values directly. Tuesday, August 10, 2010
  43. 43. Protocols Tuesday, August 10, 2010
  44. 44. Protocols Java’s Interface done Objective-C style • List of method declarations • Not associated with a particular class • Conformance, not class, is important • Useful in defining: • Methods that others are expected to implement • Declaring an interface while hiding its particular class • Capturing similarities among classes that aren't hierarchically related Tuesday, August 10, 2010
  45. 45. Protocols NSCoding NSObject NSCoding Person Account CheckingAccount SavingAccount Tuesday, August 10, 2010
  46. 46. Defining a Protocol NSCoding from Foundation Framework Objective-C equivalent to java.io.Externalizable @protocol NSCoding - (void)encodeWithCoder:(NSCoder *)aCoder; - (id)initWithCoder:(NSCoder *)aDecoder; @end Tuesday, August 10, 2010
  47. 47. Adopting a Protocol @interface Person : NSObject <NSCoding> { NSString *name; NSString *street; NSString *city, *state, *zip; } // method declarations @end Tuesday, August 10, 2010
  48. 48. Conforming to a Protocol Partial implementation of conforming Person class @implementation Person -(id)initWithCoder:(NSCoder *)coder { if (self = [super init]) { name = [coder decodeObjectForKey:@"name"]; [name retain]; } return self; } -(void)encodeWithCoder:(NSCoder *)coder { [coder encodeObject:name forKey:@"name"]; } @end Tuesday, August 10, 2010
  49. 49. @required and @optional • Protocols methods are required by default • Can be relaxed with @optional directive @protocol SomeProtocol - (void)requiredMethod; @optional - (void)anOptionalMethod; - (void)anotherOptionalMethod; @required - (void)anotherRequiredMethod; @end Tuesday, August 10, 2010
  50. 50. Categories & Extensions Tuesday, August 10, 2010
  51. 51. Categories Extending Object Features • Add new methods to existing classes • Alternative to subclassing • Defines new methods and can override existing • Does not define new instance variables • Becomes part of the class definition • Inherited by subclasses • Can be used as organizational tool • Often used in defining "private" methods Tuesday, August 10, 2010
  52. 52. Using Categories Interface @interface NSString (Extensions) -(NSString *)trim; @end Implementation @implementation NSString (Extensions) -(NSString *)trim { NSCharacterSet *charSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; return [self stringByTrimmingCharactersInSet:charSet]; } @end Usage NSString *string = @" A string to be trimmed "; NSLog(@"Trimmed string: '%@'", [string trim]); Tuesday, August 10, 2010
  53. 53. Class Extensions Unnamed Categories • Objective-C 2.0 adds ability to define "anonymous" categories • Category is unnamed • Treated as class interface continuations • Useful for implementing required "private" API • Compiler enforces methods are implemented Tuesday, August 10, 2010
  54. 54. Class Extensions Example @interface Person : NSObject { NSString *name; } -(NSString *)name; @end Tuesday, August 10, 2010
  55. 55. Class Extensions Example @interface Person () -(void)setName:(NSString *)newName; @end @implementation Person - (NSString *)name { return name; } - (void)setName:(NSString *)newName { name = newName; } @end Tuesday, August 10, 2010
  56. 56. Summary Tuesday, August 10, 2010
  57. 57. Objective-C Summary • Fully C, Fully Object-Oriented • Powerful dynamic runtime • Objective-C 2.0 added many useful new features • Garbage Collection for Mac OS X apps • Properties, Improved Categories & Protocols • Objective-C 2.1 continues its evolution: • Blocks (Closures) • Synthesize by default for properties Tuesday, August 10, 2010
  58. 58. Questions? Tuesday, August 10, 2010

×