17. A strict superset of C
• Objective-C is a strict superset of the C language
• Objective-C is not inspired by C language like Java or C#
• Objective-C has only added some concepts and their
associated keywords
• Like with C++, a well-written C program should be
compile-able as Objective-C
• Unlike with C++, there is no risk of incompatibility
between C names and Objective-C keywords
iOS Bootcamp @ ITIS
18. A strict superset of C
@
@"" @( ) @[ ] @{ } @private
@catch @property
@class @protected
@defs @protocol
@dynamic @public
@encode @required
@end @selector
@finally @synchronized
@implementation @synthesize SEL BOOL
@interface @throw IMP YES
nil NO
f
de
@optional @try
pe
Nil id
ty
in byref readwrite copy
s
er
ts
co i n
out oneway readonly nonatomic
ex
et
lar ble
m
nt
inout getter assign strong self
ra
i cu i l a
pa
rt va
bycopy setter retain weak super
en
pa a
dd
hi
iOS Bootcamp @ ITIS
20. Objective-C
void, char, int, long, float function pointer
c {array} sizeof signed, unsigned
c "string"
function
typedef, enum, union const, auto, static, extern
# preprocessor (type)casting
malloc, free
C Standard Library
for, do, while
if, else, switch, case int main(int argc, const char * argv[])
format specifiers %d %s stack vs heap
*, &, [ ]
member selection . ->
Struct break, continue, goto
iOS Bootcamp @ ITIS
42. Instance Variable Declaration
@interface MyClass : NSObject
{
@private
// Can only be accessed by instances of MyClass
NSInteger _privateIvar1;
NSString *_privateIvar2;
}
iOS Bootcamp @ ITIS
43. Instance Variable Declaration
@interface MyClass : NSObject
{
@private
// Can only be accessed by instances of MyClass
NSInteger _privateIvar1;
NSString *_privateIvar2;
@protected // Default
// Can only be accessed by instances of MyClass or MyClass's subclasses
NSInteger _protectedIvar1;
NSString *_protectedIvar2;
}
iOS Bootcamp @ ITIS
44. Instance Variable Declaration
@interface MyClass : NSObject
{
@private
// Can only be accessed by instances of MyClass
NSInteger _privateIvar1;
NSString *_privateIvar2;
@protected // Default
// Can only be accessed by instances of MyClass or MyClass's subclasses
NSInteger _protectedIvar1;
NSString *_protectedIvar2;
@package // 64-bit only
// Can be accessed by any object in the framework in which MyClass is defined
NSInteger _packageIvar1;
NSString *_packageIvar2;
}
iOS Bootcamp @ ITIS
45. Instance Variable Declaration
@interface MyClass : NSObject
{
@private
// Can only be accessed by instances of MyClass
NSInteger _privateIvar1;
NSString *_privateIvar2;
@protected // Default
// Can only be accessed by instances of MyClass or MyClass's subclasses
NSInteger _protectedIvar1;
NSString *_protectedIvar2;
@package // 64-bit only
// Can be accessed by any object in the framework in which MyClass is defined
NSInteger _packageIvar1;
NSString *_packageIvar2;
@public // Never use it !
// Can be accessed by any object
NSInteger _publicVar1;
NSString *_publicVar2;
}
iOS Bootcamp @ ITIS
46. @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 @ ITIS
47. Bad News
NO namespaces :(
Use prefix instead !
NSObject, NSString, ...
UIButton, UILabel, ...
ABAddressBook, ABRecord, ...
// Pragma Mark
PMDeveloper, PMEvent, ...
Draft Proposal for Namespaces in Objective-C: @namespace @using
http://www.optshiftk.com/2012/04/draft-proposal-for-namespaces-in-objective-c/
iOS Bootcamp @ ITIS
50. Method Declaration
- (BOOL) writeToFile:(NSString *)path atomically:(BOOL)flag;
method scope
Can be either:
+ for a class method
- for an instance method
Methods are always public !
“Private” methods defined in implementation
iOS Bootcamp @ ITIS
51. Method Declaration
- (BOOL) writeToFile:(NSString *)path atomically:(BOOL)flag;
return type
Can 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 @ ITIS
52. Method Declaration
- (BOOL) writeToFile:(NSString *)path atomically:(BOOL)flag;
method name
The method name is composed of all labels
Colons precede arguments, but are part of the method name
writeTofile:atomically:
iOS Bootcamp @ ITIS
53. Method Declaration
- (BOOL) writeToFile:(NSString *)path atomically:(BOOL)flag;
argument type argument name
Arguments come after or within the method name
iOS Bootcamp @ ITIS
55. 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 @ ITIS
57. Object Construction
• NSObject defines class method called alloc
• Dynamically allocates memory for object on the heap
• Returns new instance of receiving class
BankAccount *account = [BankAccount alloc];
• NSObject defines instance method called init
• Implemented by subclasses to initialize instance after memory has been allocated
• Subclasses commonly define several initializers (default indicated in documentation)
[account init];
• alloc and init calls are always nested into single line
BankAccount *account = [[BankAccount alloc] init];
iOS Bootcamp @ ITIS
58. Object Destruction
dealloc
• Never call explicitly
• Release all retained or copied instance variables (* if not ARC)
• Calls [super dealloc] (* if not ARC)
- (void)saveThis:(id)object {
if (_instanceVariable != object ) {
[_instanceVariable release];
_instanceVariable = [object retain];
}
}
- (void)dealloc {
[_instanceVariable release];
[super dealloc];
}
iOS Bootcamp @ ITIS
60. 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+, but depracated from 10.8+
• Not available on iOS due to performance concerns
iOS Bootcamp @ ITIS
62. Manual Reference Counting
(Only) Objective-C objects are reference counted:
• Objects start with retain count of 1 when created
• Increased with retain
• Decreased with release, autorelease
• When count equals 0, runtime invokes dealloc
1 2 1 0
alloc retain release release
dealloc
iOS Bootcamp @ ITIS
63. Autorelease
• Instead of explicitly releasing something, you mark it for a
later release
• An object called autorelease pool manages a set of
objects 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 @ ITIS
64. Autorelease
• Autorelease is NOT a Garbage Collector !
It is deterministic ⌚
• Objects returned from methods are understood to be
autoreleased if name is not in implicit retained set
(alloc, new, init or copy)
• If you spawn your own thread, you’ll have to create your
own NSAutoreleasePool
• Stack based: autorelease pools can be nested
Friday Q&A 2011-09-02: Let's Build NSAutoreleasePool
http://www.mikeash.com/pyblog/friday-qa-2011-09-02-lets-build-nsautoreleasepool.html
iOS Bootcamp @ ITIS
65. The Memory Management Rule
Everything that increases the reference count
with alloc, copy, new 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 @ ITIS
66. 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 @ ITIS
67. Automatic Reference Counting
• The Rule is still valid, but it is managed by the compiler
• No more retain, [auto]release nor dealloc
• ARC is used in all new projects by default
• Apple provides a migration tool which is build into Xcode
iOS Bootcamp @ ITIS
69. Property Access
• Generated properties are standard methods
• Accessed through normal messaging syntax
id value = [object property];
[object setProperty:newValue];
• Objective-C 2.0 property access via dot syntax
id value = object.property;
object.property = newValue;
• Dot notation is just syntactic sugar. Still uses accessor
methods. Doesn't get/set values directly
iOS Bootcamp @ ITIS
70. Property
• Objective-C 2.0 introduced new syntax for defining
accessor code:
• Much less verbose, less error prone
• Highly configurable
• Automatically generates accessor code
• Complementary to existing conventions and technologies:
• Key-Value Coding (KVC)
• Key-Value Observing (KVO)
• Cocoa Bindings
• Core Data Simplifying Accessors
iOS Bootcamp @ ITIS
81. Protocol
• 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
Java / C# Interface done
Objective-C style
iOS Bootcamp @ ITIS
84. Dynamic and Static Typing
• Dynamically-typed object:
id anObject;
• Just id
• Not id * (unless you really, really mean it: pointer to pointer)
• Statically-typed object:
BankAccount *anObject;
• Objective-C provides compile-time type checking
iOS Bootcamp @ ITIS
85. 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 @ ITIS
86. @”NSString”
• Objective-C string literals start with @
• Consistently used in Cocoa instead of “const char *”
• General-purpose Unicode string support
• NSString is immutable, NSMutableString is mutable
const char *cString = "Pragma Mark"; // C string
NSString *nsString = @"バンザイ"; // NSString @
cString = [nsString UTF8String];
nsString = [NSString stringWithCString:cString
encoding:NSUTF8StringEncoding];
iOS Bootcamp @ ITIS
87. Collections
• NSArray - ordered collection of objects
• NSDictionary - collection of key-value pairs
• NSSet - unordered collection of unique objects
• Immutable and mutable versions
NSDictionary *dic;
dic = [[NSDictionary alloc] initWithObjectsAndKeys:
@"ga", @"username", @"42", @"password", nil];
//nil to signify end of objects and keys.
iOS Bootcamp @ ITIS
89. Objective-C
• Objective-C is Fully C and Fully Object-Oriented
• Objective-C supports both strong and weak typing
• Objective-C is The Apple (only) Programming Language !
iOS Bootcamp @ ITIS