Software engineers often have to juggle multiple languages in their minds. This tutorial is a no-frill “Cliff Notes” of Objective-C language designed for help engineers to quickly get up to speed on Objective-C.
Include header files
#import
Main function
int main(int argc, char **argv) { ... }
Defining a class
Class implementation is usually placed in a *.h file. Below is a simple class definition:
@interface SampleClass:NSObject - (void)sampleMethod; @end
Implementing a class
Class implementation is usually placed in a *.m file:
@implementation SampleClass - (void)sampleMethod{ NSLog(@"Hello, World! \n"); } @end
Note the equivalent of C language printf(“Hello, World! \n”) is NSLog(@”Hello, World! \n”).
Defining a function
- (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgumentn:( argumentTypen )argumentNamen { body of the function }
All arguments after the first have a label before the “:” mark, for instance, joiningArgument2. These labels should be named to indicate what the argument is, providing documentation value. Below is a C equivalent max(int num1, int num2) function:
/* function returning the max between two numbers */ - (int) max:(int) num1 secondNumber:(int) num2 { /* local variable declaration */ int result; if (num1 > num2) { result = num1; } else { result = num2; } return result; }
Block
Block is Objective-C equivalent of lambda function:
returntype (^blockName)(argumentType)= ^{ ... };
For example:
void (^simpleBlock)(void) = ^{ NSLog(@"This is a block"); };
Here is an example of calling a block function:
#import typedef void (^CompletionBlock)(); @interface SampleClass:NSObject - (void)performActionWithCompletion:(CompletionBlock)completionBlock; @end @implementation SampleClass - (void)performActionWithCompletion:(CompletionBlock)completionBlock{ NSLog(@"Action Performed"); completionBlock(); } @end int main() { /* my first program in Objective-C */ SampleClass *sampleClass = [[SampleClass alloc]init]; [sampleClass performActionWithCompletion:^{ NSLog(@"Completion is called to intimate action is performed."); }]; return 0; }
Anatomy of a Objective-C class
In the example below, between @interface and subsequent @end holds the class definition. The Box class is a subclass of NSObject in this example, and has length, breadth as height as class variables. They are all private, except height is public, because it is defined as a @property, that is nonatomic with read-write access. What is really happening with the @property token is that read and write accessor functions are generated where @synthesize height line is added. Note @synthesize is inside the @implementation block.
#import @interface Box:NSObject { double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box } @property(nonatomic, readwrite) double height; // Property -(double) volume; @end @implementation Box @synthesize height; -(id)init { self = [super init]; length = 1.0; breadth = 1.0; return self; } -(double) volume { return length*breadth*height; } @end int main( ) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Box *box1 = [[Box alloc]init]; // Create box1 object of type Box Box *box2 = [[Box alloc]init]; // Create box2 object of type Box double volume = 0.0; // Store the volume of a box here // box 1 specification box1.height = 5.0; // box 2 specification box2.height = 10.0; // volume of box 1 volume = [box1 volume]; NSLog(@"Volume of Box1 : %f", volume); // volume of box 2 volume = [box2 volume]; NSLog(@"Volume of Box2 : %f", volume); [pool drain]; return 0; } @end
Auto release pool
The peculiar line of code:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
initializes an auto-release memory pool needed by Cocoa library. In practice, always add this line.
Defining class methods
In the above example, init() is Box constructor, and volume() is an argument-less function that returns a double.
Calling class methods
To call a class method, do:
[box1 volume]