Objective-C

142
Giuseppe Arici § The Preacher Objective-C L’ABC del Linguaggio

description

Slides della sessione su Objective-C, tenuta da Giuseppe Arici all’iOS Bootcamp di pragmamark.

Transcript of Objective-C

  • 1. Objective-C LABC del Linguaggio Giuseppe Arici The Preacher

2. Giuseppe Arici Apple iOS & Mac OS X Addicted DeveloperSuperpartes Innovation Campus & H-Farm Group Founder & Cocoa Preacher m# Pragma Mark pragmamark.org co pe y ;) ci.sep bo ari giu Fan A Social & Lazy Connected Node ot a[ tt | in | fb | * ] / giuseppe.arici ard nIm Mail Forwarder & [email protected] Bootcamp 3. Alzi la mano chi ... ? iOS Bootcamp 4. Agenda ia & Fi losoa Stortica & FisicaM atemaiOS Bootcamp 5. The HistoryiOS Bootcamp 6. 40 Years !1971 1981 1991 2001 2011iOS Bootcamp 7. Dennis Ritchie @ Bell Labs1969 - 1973iOS Bootcamp 8. Alan Kay @ Xerox PARC1972 - 1980iOS Bootcamp 9. Steve Jobs & Steve Wozniak @ 1976iOS Bootcamp 10. Apple Team @ Xerox PARC 1979 iOS Bootcamp 11. Brad Cox & Tom Love @ ITT 1980 iOS Bootcamp 12. Byte Magazine # Agosto1981 1981iOS Bootcamp 13. The OOPC1982iOS Bootcamp 14. StepStone (formerly PPI) 1983 iOS Bootcamp 15. OOP An Evolutionary Approach1986iOS Bootcamp 16. Steve Jobs John Sculley 1985iOS Bootcamp 17. NeXT Computer (28)1986 iOS Bootcamp 18. NeXT Objective-C StepStone1988 iOS Bootcamp 19. WWW & Doom & Mathematica NeXTcube 1991iOS Bootcamp 20. NeXT + Sun = OpenStep API NSObject Java Was Strongly Inuenced by Objective-C Patrick Naughton, co-creator of Java Programming Language1993 iOS Bootcamp 21. NeXT Apple1996 iOS Bootcamp 22. Code Name Rhapsody1997 iOS Bootcamp 23. Mac OS X v10.02001 iOS Bootcamp 24. clasfastse enu @pmexteratropionnsio/ for ertns iny Objective-C 2.0 2006 garoptbagion ec newolleal pro ctionrun @ timtocOSe ol XiOS Bootcamp 25. The iPhone 2007iOS Bootcamp 26. The iPhone SDK 2008 iOS Bootcamp 27. Chris Lattner @ Source: http://nondot.org/sabre/Resume.htmlDirector and Architect, Low-Level ToolsSeptember 2011 - OngoingSenior Manager and Architect, Low-Level ToolsJune 2010 - September 2011Senior Manager of Compilers and Low-Level Tools, Compiler ArchitectSeptember 2009 - June 2010Manager of Compilers and Low-Level Tools, Compiler ArchitectJuly 2008 - September 2009LLVM Compiler Group Manager and Compiler ArchitectDecember 2006 - July 2008Senior Compiler Engineer and Tech LeadJune 2005 - December 2006 2005 iOS Bootcamp 28. LLVM Compiler InfrastructureSource:The Architecture of Open Source Applications http://www.aosabook.org/en/llvm.html 2007iOS Bootcamp 29. Clang (Static Analyzer)2009iOS Bootcamp 30. ^ Blocks & GCD 2009 iOS Bootcamp 31. Xcode 4 2010iOS Bootcamp 32. Automatic Reference Counting* Messaggio Promozionale: http://www.whymca.org/intervento/automatic-reference-counting2011iOS Bootcamp 33. @s Enu ms yntwit Ob hesh j ecize xedt litund bye rlyieradefaul ngtyplste WWDC 2012 Session 405: Modern Objective-C by Patrick C. Beard Modern Objective-CUnSubord Box screreipdmedtingeth Exp me odres dec 2012thol ara sio ds tionnssiOS Bootcamp 34. TIOBE: Top 10 July 2012Source: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html iOS Bootcamp 35. TIOBE: Long Term Trends Source: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.htmliOS Bootcamp 36. TIOBE: Objective-C Programming Language of the Year2011Source: http://www.tiobe.com/index.php/paperinfo/tpci/Objective-C.html iOS Bootcamp 37. Ipse dixit: Tom Love C++ Objective-C and C++ both started from C, but they went in two very different directions. Which approach do you prefer now? Tom: Theres the successful direction, and then theres the approach that Bjarne took with C++. In one case, it was a small, simple dare I say, elegant programming language that was very crisp and well dened. In the other case it was a pretty ugly, complicated, difcult language that had some really troublesome features. I think those are the distinctions between the two. iOS Bootcamp 38. Intervallo !?iOS Bootcamp 39. The Language iOS Bootcamp 40. Fundamental Laws iOS Bootcamp 41. A strict superset of C Objective-C is not inspired by C language like Java or C# Objective-C is a strict superset of the C language Objective-C has only added some concepts and theirassociated keywords Like with C++, a well-written C program should becompile-able as Objective-C Unlike with C++, there is no risk of incompatibilitybetween C names and Objective-C keywords iOS Bootcamp 42. A strict superset of C@@"" @( ) @[ ] @{ }@private@catch@property@class@protected@defs @protocol@dynamic@public@encode @required@end@selector@nally @synchronized@implementation @synthesize SEL BOOL@interface@throwIMP YESnil NO f de@optional @try peNil id ty inbyref readwrite copy ser ts co i n out onewayreadonlynonatomicexetlar ble m nt inout getterassignstrong self rai cu i l a part va bycopysetterretainweak superenpa addhi iOS Bootcamp 43. Requirements iOS Bootcamp 44. Objective-C void, char, int, long, oatfunction pointerc {array} sizeofsigned, unsignedc "string" functiontypedef, enum, unionconst, auto, static, extern # preprocessor(type)castingmalloc, freeC Standard Library for, do, whileif, else, switch, case int main(int argc, const char * argv[])format speciers %d %sstack vs heap *, &, [ ] member selection . -> Struct break, continue, gotoiOS Bootcamp 45. Objective-CPolymorphism Message passing Subclass Method ClassDelegationInstance Variable SuperclassMethod overriding Inheritance Dynamic dispatch / binding EncapsulationAbstraction Interface / Protocol iOS Bootcamp 46. ClassiOS Bootcamp 47. Bad News NO namespaces Use prex instead !NSObject, NSString, ...UIButton, UILabel, ...ABAddressBook, ABRecord, ...// Pragma MarkPMDeveloper, PMEvent, ...Draft Proposal for Namespaces in Objective-C: @namespace @usinghttp://www.optshiftk.com/2012/04/draft-proposal-for-namespaces-in-objective-c/ iOS Bootcamp 48. Class#import@interface@implementation// Person.h// Person.m #import "Person.h"@interface Person : NSObject @implementation Person@end @endiOS Bootcamp 49. Class @interface#import @interface BankAccount : NSObject{NSInteger _balance;}- (NSInteger) withdraw:(NSInteger)amount;- (void) deposit:(NSInteger)amount;@endiOS Bootcamp 50. Class @interface#import @interface BankAccount : NSObject{base typesNSInteger _balance;}import- (NSInteger) withdraw:(NSInteger)amount;- (void) deposit:(NSInteger)amount;@endiOS Bootcamp 51. Class @interface#import @interface BankAccount : NSObject{NSInteger _balance;}class denition- start(NSInteger) withdraw:(NSInteger)amount;- (void) deposit:(NSInteger)amount;@endiOS Bootcamp 52. Class @interface#import @interface BankAccount : NSObject{NSInteger _balance;} class name- (NSInteger) withdraw:(NSInteger)amount;- (void) deposit:(NSInteger)amount;@endiOS Bootcamp 53. Class @interface extends#import @interface BankAccount : NSObject{NSInteger _balance;} parent class- (NSInteger) withdraw:(NSInteger)amount;- (void) deposit:(NSInteger)amount;@endiOS Bootcamp 54. Class @interface#import @interface BankAccount : NSObject{NSInteger _balance;} instance- (NSInteger) withdraw:(NSInteger)amount;- (void) deposit:(NSInteger)amount; variables@endiOS Bootcamp 55. Class @interface#import @interface BankAccount : NSObject{NSInteger _balance;}- (NSInteger) withdraw:(NSInteger)amount;- (void) deposit:(NSInteger)amount;@endmethods declarationsiOS Bootcamp 56. Class @interface#import @interface BankAccount : NSObject{NSInteger _balance;} class denition- (NSInteger) withdraw:(NSInteger)amount;-end(void) deposit:(NSInteger)amount;@endiOS Bootcamp 57. Class @implementation#import "BankAccount.h"@implementation BankAccount- (id) init {self = [super init];return self;}- (NSInteger) withdraw:(NSInteger)amount {return amount;}- (void) deposit:(NSInteger)amount {_balance += amount;}@end iOS Bootcamp 58. Class @implementation#import "BankAccount.h"@implementation BankAccount interface- (id) init {import[superself = init]; return self;}- (NSInteger) withdraw:(NSInteger)amount {return amount;}- (void) deposit:(NSInteger)amount { _balance += amount;}@end iOS Bootcamp 59. Class @implementation#import "BankAccount.h"@implementation BankAccount- (id) init {class implementationself = [super init];return self;}start- (NSInteger) withdraw:(NSInteger)amount {return amount;}- (void) deposit:(NSInteger)amount { _balance += amount;}@end iOS Bootcamp 60. Class @implementation#import "BankAccount.h"@implementation BankAccount- (id) init {self = [super init];return self;}- (NSInteger) withdraw:(NSInteger)amount {return amount;} methods with- (void) deposit:(NSInteger)amount {_balance += amount; bodies}@endiOS Bootcamp 61. Class @implementation#import "BankAccount.h"@implementation BankAccount- (id) init {self = [super init];return self;}- (NSInteger) withdraw:(NSInteger)amount {return amount;} class implementation- (void) deposit:(NSInteger)amount { end_balance += amount;}@end iOS Bootcamp 62. @class directive @class directive provides minimal information about a class. @class indicates that the name you are referencing is a class! The use of the @class is known as a forward declaration// Rectangle.h // Rectangle.m#import "Shape.h"#import "Rectangle.h"@class Point;#import "Point.h"@interface Rectangle : Shape @implementation Rectangle- (Point *)center; - (Point *)center { // ... }@end @end iOS Bootcamp 63. Instance Variable Declaration@interface MyClass : NSObject{@private// Can only be accessed by instances of MyClassNSInteger _privateIvar1;NSString *_privateIvar2;@protected // Default// Can only be accessed by instances of MyClass or MyClasss subclassesNSInteger _protectedIvar1;NSString *_protectedIvar2;@package // 64-bit only// Can be accessed by any object in the framework in which MyClass is definedNSInteger _packageIvar1;NSString *_packageIvar2;;@public // Never use it !// Can be accessed by any object scopeNSInteger _publicVar1;NSString *_publicVar2;qualiers}iOS Bootcamp 64. Method & Message iOS Bootcamp 65. Method Declaration- (BOOL) writeToFile:(NSString *)path atomically:(BOOL)flag; In other languages, might be:bool MyClass::writeToFileAtomically(std::string path, bool flag); // C++public virtual bool WriteToFileAtomically(string path, bool flag); // C#public boolean writeToFileAtomically(String path, boolean flag); // Javapublic function writeToFileAtomically(path, flag) // PHPdef writeToFileAtomically(self, path, flag): # Pythondef writeToFileAtomically(path, flag) # Ruby iOS Bootcamp 66. Method Declaration - (BOOL) writeToFile:(NSString *)path atomically:(BOOL)flag;method scopeCan be either:+ for a class method- for an instance methodMethods are always public !Private methods dened in implementation iOS Bootcamp 67. Method Declaration - (BOOL) writeToFile:(NSString *)path atomically:(BOOL)flag;return typeCan be any valid data type, including: void returns nothing id a pointer to an object of any class NSString * a pointer to an NSString BOOL a boolean (YES or NO) iOS Bootcamp 68. Method Declaration - (BOOL) writeToFile:(NSString *)path atomically:(BOOL)flag;method nameThe method name is composed of all labelsColons precede arguments, but are part of the method namewriteTofile:atomically: iOS Bootcamp 69. Method Declaration - (BOOL) writeToFile:(NSString *)path atomically:(BOOL)flag; argument typeargument nameArguments come after or within the method nameVariadic methods can take variable arguments- (id)stringWithFormat:(NSString *)format ...stdarg: va_list va_start() va_arg() va_end() iOS Bootcamp 70. @selectorSEL callback = @selector(writeToFile:atomically:); data typemacro tofor selectorcreate selectorConceptually similar to function pointerUseful for callback type behavior if ([helper respondsToSelector:callback]) { [helper performSelector:callback withObject:arguments]; } iOS Bootcamp 71. Message Passing Methods are invoked by passing messages Messages arent bound to method implementations untilruntime. The compiler converts a message expression:[receiver message]; into a call on a messaging function objc_msgSend:objc_msgSend(receiver, selector); Any arguments passed in the message are also handed toobjc_msgSend:objc_msgSend(receiver, selector. arg1, arg2, ...); iOS Bootcamp 72. Message Passing[data writeToFile:@"/tmp/data.txt" atomically:YES]; In other languages, might be:data->writeToFileAtomically("/tmp/data.txt", true); // C++data.WriteToFileAtomically("/tmp/data.txt", true); // C#data.writeToFileAtomically("/tmp/data.txt", true); // Java$data->writeToFileAtomically("/tmp/data.txt", TRUE); // PHPdata.writeToFileAtomically(/tmp/data.txt, True) # Pythondata.writeToFileAtomically /tmp/data.txt, true # RubyiOS Bootcamp 73. Message Passing [data writeToFile:@"/tmp/data.txt" atomically:YES]; square brackets syntaxNested Message Passing: [ [ ][ ][ [ ] ] ] [[store data] writeToFile:[@"/tmp/data.txt" lowercaseString]atomically:[[PMOption sharedOption] writeMode]encoding:NSUTF8StringEncoding error:&error]; iOS Bootcamp 74. Message Forwarding In Objective C is very common to do message forwarding(a strategy pattern) When an object receives a message and it does not have acorresponding method, it can delegates the task to anotherobject- (void)forwardInvocation:(NSInvocation*)invocation {SEL sel = [invocation selector];if ([helper respondsToSelector:sel]) {[invocation invokeWithTarget:helper];} else {[self doesNotRecognizeSelector:sel];}}iOS Bootcamp 75. Message Terminology Message expression[data writeToFile:@"/tmp/data.txt" atomically:YES]; Message[data writeToFile:@"/tmp/data.txt" atomically:YES]; Selector[data writeToFile:@"/tmp/data.txt" atomically:YES]; Method{ ... } // The code selected by a messageiOS Bootcamp 76. Self & Super Methods have implicit reference to owning object called self(similar to Java and C# this, but self is a l-value) Additionally have access to superclass methods using super- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];[self reloadData];} iOS Bootcamp 77. ObjectLife Cycle iOS Bootcamp 78. Object Construction NSObject denes class method called alloc Dynamically allocates memory for object on the heap Returns new instance of receiving classBankAccount *account = [BankAccount alloc]; NSObject denes instance method called init Implemented by subclasses to initialize instance after memory has been allocated Subclasses commonly dene several initializers (default indicated in documentation)BankAccount *account = [[BankAccount alloc] init]; alloc and init calls are always nested into single lineBankAccount *account = [[BankAccount alloc] init];iOS Bootcamp 79. Object Construction initWithNeeds to call superSetup instance variablesReturns self- (id) init {self = [super init];if (self) { _myInstanceVariable = @"Pragma Mark !";}return self;} iOS Bootcamp 80. Object Destruction deallocNever call explicitlyRelease all retained or copied instance variables (* if not ARC)Calls [super dealloc] (* if not ARC)- (void)saveThis:(id)object {if (_myInstanceVariable != object ) {[_myInstanceVariable release];_myInstanceVariable = [object retain];}}- (void)dealloc {[_myInstanceVariable release];[super dealloc];} iOS Bootcamp 81. MemoryManagement iOS Bootcamp 82. Memory Management Manual Reference Counting Higher level abstraction than malloc / free Straightforward approach, but must adhere to conventions and rules Automatic Reference Counting (ARC) Makes memory management the job of the compiler (and runtime) Available for: partially iOS 4+ or OS X 10.6+ / fully iOS 5+ or OS X 10.7+ Garbage Collection Only available for OS X 10.5+ Not available on iOS due to performance concernsiOS Bootcamp 83. Manual Reference Counting(Only) objective-C objects are reference counted: Objects start with retain count of 1 Increased with retain Decreased with release, autorelease When count equals 0, runtime invokes dealloc121 0alloc retainrelease release dealloc iOS Bootcamp 84. Objects you createFor objects you create with [[SomeClass alloc] init] or[myInstance copy] (without autoreleasing): Retain should not need to be called Release when you are done using it in the {code block}- (void)someMethod {NSArray *someArray = [[NSArray alloc] init];_myInstanceVariable = someArray;}- (void)dealloc {[_myInstanceVariable release];[super dealloc];}iOS Bootcamp 85. Objects you dont createFor objects you dont create (e.g. get from methods): Retain only when saving to instance (or static) variable Release only if you retained it by saving it (as in above case)- (void)someMethod {id anObject = [someArray objectAtIndex:0];_myInstanceVariable = [anObject retain];}- (void)dealloc {[_myInstanceVariable release];[super dealloc];} iOS Bootcamp 86. AutoreleaseWhat if you create an object and you are returning it from amethod, how would you be able to release it?- (NSArray *)objects {NSArray *myArray = [[NSArray alloc] init];}return myArray;Leak ! - (NSArray *)objects {NSArray *myArray = [[NSArray alloc] init];return [myArray release];}Crash !- (NSArray *)objects {NSArray *myArray = [[NSArray alloc] init];return [myArray autorelease];} Right ! iOS Bootcamp 87. Autorelease Instead of explicitly releasing something, you mark it for alater release An object called autorelease pool manages a set ofobjects to release when the pool is released Add an object to the release pool by calling autorelease@autoreleasepool {// code goes here}NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];// code goes here[pool release];iOS Bootcamp 88. Autorelease Autorelease is NOT a Garbage Collector !It is deterministic Objects returned from methods are understood to beautoreleased if name is not in implicit retained set(alloc, new, init or copy) If you spawn your own thread, youll have to create yourown NSAutoreleasePool Stack based: autorelease pools can be nested Friday Q&A 2011-09-02: Lets Build NSAutoreleasePoolhttp://www.mikeash.com/pyblog/friday-qa-2011-09-02-lets-build-nsautoreleasepool.htmliOS Bootcamp 89. Memory Management RuleEverything that increases the retain count withalloc, [mutable]copy[WithZone:] or retain is in charge of the corresponding [auto]release.From C++ to Objective-C http://pierre.chachatelier.fr/programmation/objective-c.php iOS Bootcamp 90. Automatic Reference Counting Automatic Reference Counting (ARC) in Objective-C makes memory management the job of the compiler. By enabling ARC with the new Apple LLVM compiler, you will never need to type retain or release again, dramatically simplifying the development process, while reducing crashes and memory leaks. The compiler has a complete understanding of your objects, and releases each object the instant it is no longer used, so apps run as fast as ever, with predictable, smooth performance.(Apple, iOS 5 for developers http://developer.apple.com/technologies/ios5)iOS Bootcamp 91. Automatic Reference Counting The Rule is still valid, but it is managed by the compiler No more retain, release, autorelease nor dealloc New lifetime qualiers for objects, which includes zeroingweak references (only available on iOS 5+ & OS X 10.7+) Apple provides a migration tool which is build into Xcode iOS Bootcamp 92. Automatic Reference Counting * Messaggio Auto-Promozionale: http://www.whymca.org/intervento/automatic-reference-countingiOS Bootcamp 93. Property iOS Bootcamp 94. Property Objective-C 2.0 introduced new syntax for deningaccessor code: Much less verbose, less error prone Highly congurable Automatically generates accessor code Complementary to existing conventions and technologies: Key-Value Coding (KVC) Key-Value Observing (KVO) Cocoa Bindings Core Data Simplifying AccessorsiOS Bootcamp 95. Property Declaration@property(attributes) type name;Attribute Impacts readonly / readwrite Mutabilitysetter / getterAPI nonatomic Concurrency assign / retain / copy weak / strong (* in ARC)Storage iOS Bootcamp 96. Property Declaration@property(attributes) type name;AttributeImpacts readonly / readwriteMutabilitygetter / setter API nonatomic Concurrency assign / retain / copy weak / strong (* in ARC)Storage@property(readonly) NSString *accountNumber; iOS Bootcamp 97. Property Declaration@property(attributes) type name;AttributeImpacts readonly / readwriteMutabilitysetter / getter API nonatomicConcurrency assign / retain / copy weak / strong (* in ARC) Storage@property(getter=isActive) BOOL active;iOS Bootcamp 98. Property Declaration@property(attributes) type name;AttributeImpacts readonly / readwriteMutabilitygetter / setter API nonatomic Concurrency assign / retain / copy weak / strong (* in ARC) Storage@property(nonatomic, retain) NSDate *createdAt;iOS Bootcamp 99. Property Declaration@property(attributes) type name;AttributeImpacts readonly / readwriteMutabilitygetter / setter API nonatomic Concurrency assign / retain / copy weak / strong (* in ARC) Storage@property(readwrite, copy) NSString *accountNumber;iOS Bootcamp 100. Retain CyclesParent Childretain11retain iOS Bootcamp 101. Retain CyclesParent Childretain01assign iOS Bootcamp 102. Retain Cycles assignX unsafe_unretainednilreleaseXweak ControllernilViewas View DelegateNew with ARC iniOS 5+ & OS X 10.7+ iOS Bootcamp 103. Property @interface#import @interface BankAccount : NSObject {NSString *_accountNumber;NSDecimalNumber *_balance;NSDecimalNumber *_fees;BOOL _active;}@property(readwrite, copy) NSString *accountNumber;@property(readwrite, retain) NSDecimalNumber *balance;@property(readonly) NSDecimalNumber *fees;@property(getter=isActive) BOOL active;@end iOS Bootcamp 104. Property @interface#import @interface BankAccount : NSObject {// No more instance variable declarations !New in} iOS 4+ & OS X 10.6+@property(readwrite, copy) NSString *accountNumber;@property(readwrite, retain) NSDecimalNumber *balance;@property(readonly) NSDecimalNumber *fees;@property(getter=isActive) BOOL active;@end iOS Bootcamp 105. Property @implementation#import "BankAccount.h"@implementation BankAccount//...@synthesize accountNumber = _accountNumber;@synthesize balance = _balance;@synthesize fees = _fees;@synthesize active = _active;//...@endiOS Bootcamp 106. Property @implementation#import "BankAccount.h"@implementation BankAccount// No more @synthesize statements ! New inXcode 4.4+(WWDC 2012)//...@endiOS Bootcamp 107. Property Access Generated properties are standard methods Accessed through normal messaging syntaxid value = [object property];[object setProperty:newValue]; Objective-C 2.0 property access via dot syntaxid value = object.property;object.property = newValue; Dot notation is just syntactic sugar. Still uses accessormethods. Doesnt get/set values directly iOS Bootcamp 108. Protocol iOS Bootcamp 109. Protocol List of method declarations Not associated with a particular class Conformance, not class, is important Useful in dening Methods that others are expected to implement Declaring an interface while hiding its particular class Capturing similarities among classes that arent hierarchically relatedJava / C# Interface doneObjective-C styleiOS Bootcamp 110. Protocol Dening a Protocol@protocol NSCoding- (void)encodeWithCoder:(NSCoder *)aCoder;- (id)initWithCoder:(NSCoder *)aDecoder;@end Adopting a Protocol@interface Person : NSObject {NSString *_name;}// method & property declarations@end iOS Bootcamp 111. Protocol Conforming to a Protocol@implementation Person// Partial implementation of conforming Person class- (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 iOS Bootcamp 112. @required & @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;@endiOS Bootcamp 113. Category & ExtensioniOS Bootcamp 114. Category Add new methods to existing classes Alternative to subclassing Denes new methods and can override existing Does not dene new instance variables (* in case use Associative References) Becomes part of the class denition (Inherited by subclasses) Can be used as organizational tool Often used in dening private methodsExtending ObjectFeatures iOS Bootcamp 115. Category Dening and using a Category// File NSString+PMAddition.h@interface NSString (PMAddition)- (NSString *)trim;@end// File NSString+PMAddition.m@implementation NSString (PMAddition)- (NSString *)trim {NSCharacterSet *cs; cs = [NSCharacterSet whitespaceAndNewlineCharacterSet];return [self stringByTrimmingCharactersInSet:charSet];}@end#import "NSString+PMAddition.h"// ...NSString *string = @" A string to be trimmed";NSLog(@"Trimmed string: %@", [string trim]); iOS Bootcamp 116. Class Extension Objective-C 2.0 adds ability to dene anonymous categories Class extension is unnamed Treated as class interface continuations Useful for implementing required private API Compiler enforces methods are implemented Unnamed Categories iOS Bootcamp 117. Class Extension Interface@interface Person : NSObject {NSUInteger _age;}- (NSUInteger)age;@end iOS Bootcamp 118. Class Extension Implementation + Private Method@interface Person ()- (void)setAge:(NSUInteger)age;@end@implementation Person- (NSUInteger)age {return _age;}- (void)setAge:(NSUInteger)age {_age = age;}@endiOS Bootcamp 119. Exception & BlockiOS Bootcamp 120. Exception Very few uses for @try, @catch, @throw, and @nally Reserve the use of exceptions for programming or unexpected runtime errors (very different from Java / C#) NSError and the Cocoa error-delivery mechanism are the recommended way to communicate expected errors @try { // do something } @catch (NSException *e) { // handle exception } @finally { // close resources }- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error;iOS Bootcamp 121. Block Similar to standard C functions but, in addition toexecutable code, blocks may also contain variable bindings Also called closures (or lambdas), because they closearound variables in their scope New in A nonstandard extension to C iOS 4+ & OS X 10.6+ Used as anonymous functionsint (^myBlock)(int) = ^(int num) { return num * multipier; };[objects sortUsingComparator:^(id firstObject, id secondObject) { return [firstObject compare:secondObject];}];iOS Bootcamp 122. Base TypeiOS Bootcamp 123. Dynamic and Static Typing Dynamically-typed object:id anObject;Just idNot id * (unless you really, really mean it: pointer to pointer) Statically-typed object:BankAccount *anObject; Objective-C provides compile-time type checking Objective-C always uses dynamic bindingiOS Bootcamp 124. The nil object pointer Test for nil explicitly: if (nil == person) return; // Yoda Syntax Or implicitly: if (!person) return; Can use in assignments and as arguments if expected person = nil; [button setTarget: nil]; Sending a message to nil? NO Problem ! person = nil; [person talk]; iOS Bootcamp 125. The BOOL typedef When Objective-C was developed, C had no boolean type(C99 introduced one) Objective-C uses a typedef to dene BOOL as a type BOOL flag = NO; Macro included for initialization and comparison:YES and NO if (flag) { // ... if (!flag) { // ... if (YES == flag) { // ... use !!flag if (NO == flag) { // ... flag = YES; flag = 1;iOS Bootcamp 126. Foundation Framework iOS Bootcamp 127. Framework Frameworks are functionally similar to shared libraries A compiled object that can be dynamically loaded into aprograms address space at runtime Frameworks add associated resources, header les, anddocumentation iOS Bootcamp 128. Foundation.framework Values and Strings Collections User defaults Archiving Notications Tasks, timers, threads File system, I/O, bundles URL, XML, ScanneriOS Bootcamp 129. NSObject Root Class @interface BankAccount : NSObject Implements many basics Memory management [anObject retain]; Introspection if ([anObject isKindOfClass:[Person class]]) { Object equality if ([obj1 isEqual:obj2]) { // NOT obj1 == obj2 String representation (description is like toString() in Java or ToString() in C#) NSLog(@"%@", [anObject description]); NSLog(@"%@", anObject); // call description iOS Bootcamp 130. NSString @ General-purpose Unicode string support NSString objects are conceptually UTF-16 endianness Consistently used in Cocoa instead of const char * Objective-C string literals start with @ NSString is immutable, NSMutableString is mutable const char *cString = "Pragma Mark"; // C string NSString *nsString = @""; // NSString @ cString = [nsString UTF8String]; nsString = [NSString stringWithCString:cStringencoding:NSUTF8StringEncoding];iOS Bootcamp 131. Format Strings Similar to printf, but with %@ added for objects: NSString *title = @"The Preacher"; NSString *whoami = [NSString stringWithFormat:@"I am %@ !", title]; // whoami would be set to: // I am The Preacher ! Also used for logging with NSLog macro: NSLog(@"I am a %@, I have %d items",[array className], [array count]); // would log something like: // I am a NSArray, I have 42 itemsiOS Bootcamp 132. Collections NSArray - ordered collection of objects NSDictionary - collection of key-value pairs NSSet - unordered collection of unique objects Immutable and mutable versionsImmutable collections can be shared without side effectMutable objects typically carry a performance overheadNSDictionary *dic;dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"ga", @"username", @"42", @"password", nil];//nil to signify end of objects and keys. iOS Bootcamp 133. Collections Collections can contain only objects Wrap primitive types in NSNumber or NSValue New literal syntax for: New inarray @[ obj, ... ]Xcode 4.4+dictionary @{ key : obj, ...}(WWDC 2012)boxed expressions @( number or c string ) As a shortcut, number literals can be boxed without using the ( )NSArray *a = @[@"42", @42, @"42", @3.14];NSDictionary *d = @{ @1 : @"black", @2 : @"white"}; iOS Bootcamp 134. Fast Enumeration Added in Objective-C 2.0 for in similar to Java / C# foreach Use with NSArray, NSDictionary, NSSet or with any objectof class that adopt the NSFastEnumeration protocol NSArray *people; // ... // Old school for (int i = 0; i < [people count]; ++i) { Person *person = [people objectAtIndex:i]; } // New school for (Person *person in people) { }iOS Bootcamp 135. SummaryiOS Bootcamp 136. Objective-C 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 LLVM continues evolution: Blocks (Closures) Automatic Reference Counting Synthesize by default for properties New literalsiOS Bootcamp 137. Objective-C Reference BooksiOS Bootcamp 138. Are you bored !?The Objective-C Programming LanguageObjective-C Runtime Programming GuideiOS Bootcamp 139. Questions [email protected]@pragmamark.org iOS Bootcamp 140. Whats NeXT !?Objective-C dedRuntimes DelightMeRe ytap ent orloarog em em Ob ra jec mmnag C: Mtive ing-C inMa AR hal D k & atcisp ntr locCode Ce t ^B W Gen ith er and ouLLV atio Gr All ab M n Never Say Never AgainThe Objective-C++ iOS Bootcamp 141. One More Thing ! iOS Bootcamp 142. Thanks giuseppearici.com pragmamark.org iOS Bootcamp