Objective-C A Beginner's Dive (with notes)

62
Objective-C A Beginner’s Dive Saturday, March 9, 13
  • date post

    21-Oct-2014
  • Category

    Education

  • view

    554
  • download

    0

description

Objective-C is a Smalltalk-like Object-Oriented layer on top of the C language. It is the official language of OS X and iOS. Assuming you have a background in Object-Oriented Programming and a basic understanding of the C language or syntax, this talk will cover everything you need to know about Objective-C. By the end of the talk, you will understand how to make and use your own objects, the Foundation Framework and the data structures it provides, and the Objective-C specific language constructs and syntactic-sugar.

Transcript of Objective-C A Beginner's Dive (with notes)

Page 1: Objective-C A Beginner's Dive (with notes)

Objective-CA Beginner’s Dive

Saturday, March 9, 13

Page 2: Objective-C A Beginner's Dive (with notes)

I Assume

• A Background in Java or C++

• An understanding of OOP

• A basic understanding of C

Saturday, March 9, 13

Page 3: Objective-C A Beginner's Dive (with notes)

What is Objective-C?

• Superset of C

• Smalltalk style Object-Oriented

• The Official Language for iOS and OS X

Saturday, March 9, 13

Page 4: Objective-C A Beginner's Dive (with notes)

Cool!But before we dive in...

Saturday, March 9, 13

Page 5: Objective-C A Beginner's Dive (with notes)

Hello World!//// main.m

#include <stdio.h>#include <Foundation/Foundation.h>

int main(int argc, const char **argv){ NSString *message = @"Hello World!"; printf("%s\n", [message cString]); return 0;}

Saturday, March 9, 13

The main() program runs.Make a string object called message with the value “Hello World!”Print message to the screen followed by a newline character.End the program.

Page 6: Objective-C A Beginner's Dive (with notes)

Hello World!• Objective-C String Literal

• @”Hello World!”

• C Function

• printf()

• main()

• Objective-C message

• [message cString]

//// main.m

#include <stdio.h>#include <Foundation/Foundation.h>

int main(int argc, const char **argv){ NSString *message = @"Hello World!"; printf("%s\n", [message cString]); return 0;}

Saturday, March 9, 13

This shows that you can have C code along-side Objective-C. (well, actually, it’s visa-versa)This shows some Objective-C @ symbol action.This shows an Objective-C message using those fancy square brackets.

Page 7: Objective-C A Beginner's Dive (with notes)

Ok.Now, on to the teaching!

Saturday, March 9, 13

Page 8: Objective-C A Beginner's Dive (with notes)

Objective-C Features

• C Functions

• C Structs

• C Unions

• C Pointers

• C Arrays

• C Everything Else

Saturday, March 9, 13

You can do all the C you want in your Objective-C. It’s called a superset for a reason!Fun fact! C++ is not a superset. It changes some stuff...

Page 9: Objective-C A Beginner's Dive (with notes)

Objective-C Features

• Objects

• Methods

• Inheritance

• Properties

• Protocols

• Categories

• Data and Collections

• Object Literals

• Object Subscripts

• Forin loops

• Blocks and Closures

• ARC

Saturday, March 9, 13

Objective-C adds on to C all this Object-Oriented stuff on top.

ARC - Automatic Reference Counting

Page 10: Objective-C A Beginner's Dive (with notes)

You Will Learn About

• Making and Using Objects

• Using Foundation Framework Data Types

• Automatic Reference Counting (ARC)

Saturday, March 9, 13

Page 11: Objective-C A Beginner's Dive (with notes)

Writing ObjectsA Quick Run-Through

Saturday, March 9, 13

Page 12: Objective-C A Beginner's Dive (with notes)

Objects

• Interface

• like Java’s Interface, but every object has one

• placed in the header file

• Implementation

• must fill minimum requirements of Interface

• placed in the implementation file

Saturday, March 9, 13

Page 13: Objective-C A Beginner's Dive (with notes)

Example Object//// MyObject.h// Interface

#import <Foundation/Foundation.h>

@interface MyObject : NSObject { int _myInt;}

// method declarations go here

@end

//// MyObject.m// Implementation

#import “MyObject.h”

@implementation MyObject

// method implementations go here

@end

Saturday, March 9, 13

NSObject is the superclass. NSObject is the root of all Foundation Framework objects.Instance Variables can be listed within the optional curly brackets after the interface opening.Instance Variables can be declared in either the Implementation, Interface, or both.

Page 14: Objective-C A Beginner's Dive (with notes)

Objects (More Info)

• Objects have Instance Variables (ivars)

• No Class variables, use C static globals

• No enforced “public” and “private”

• Object Instances can be of type:

•id

•Class *

Saturday, March 9, 13

id is the generic object type. All objects are of type id.If you want to be more specific, objects can be represented as pointers to their class.

Page 15: Objective-C A Beginner's Dive (with notes)

Object Methods

• Class Method or Instance Method

• Variables are “named” in the method’s signature (fancy word for method name)

• Default return and variable type is id

Saturday, March 9, 13

Page 16: Objective-C A Beginner's Dive (with notes)

Format of a Method

+/- (return type)methodName;

+/- (return type)methodWithVar:(var type)var;

+/- (return type)methodWithVar1:(var type)var1 ! ! ! ! ! ! ! ! var2:(var type)var2;

Saturday, March 9, 13

The + denotes a class method, where the - denotes an instance method.The default return type is id, the generic Objective-C Object.The names of these methods are methodName, methodWithVar:, and methodWithVar1:var2:.When pronounced, there is a slight pause at each colon.

Page 17: Objective-C A Beginner's Dive (with notes)

Method Examples//// MyObject.m// Implementation

#import “MyObject.h”

@implementation MyObject

// setter- (void)setMyInt:(int)myInt { _myInt = myInt;}

// getter- (int)myInt { return _myInt;}

@end

//// MyObject.h// Interface

#import <Foundation/Foundation.h>

@interface MyObject : NSObject { int _myInt;}

// setter- (void)setMyInt:(int)myInt;

// getter- (int)myInt;

@end

Saturday, March 9, 13

Here are two instance methods in our object.These methods are following the standard style for accessors and mutators in Objective-C.Getters are methods whose name match the variable in question, and setters begin with the word set.

Page 18: Objective-C A Beginner's Dive (with notes)

Object Method Calling

• Not like C, C++, or Java

• Based on Smalltalk message passing

• The Square Brackets [] are your friend!

[object method];[object methodWithVar:value];[object methodWithVar1:val1 ! ! ! ! ! ! ! ! var2:val2];

Saturday, March 9, 13

If you need to make your method call multi-line, the general convention is to line up the colons.Xcode generally lines them up for you with the tab key.

Page 19: Objective-C A Beginner's Dive (with notes)

Testing Responsiveness to a Selector

• The name of a method is its SelectorSEL mySelector = selector(myMethodWithParameter:)

• Every object inherits respondsToSelector:

• Takes the selector to test for

• Returns YES when the object can respond to that method

• Returns NO when the object cannot respond to that method

Saturday, March 9, 13

Page 20: Objective-C A Beginner's Dive (with notes)

Object Constructor

• Not a special method (unlike Java)

• Just an instance method to set up the Object’s Instance Variables

• Generally named init

Saturday, March 9, 13

Page 21: Objective-C A Beginner's Dive (with notes)

Generic Constructor

- (id)init { if (self = [super init]) { // initialize variables } return self;}

Saturday, March 9, 13

This code calls the superclass’s init method and sets the self variable to its result.If there is a problem in the initialization, [super init] will return 0, which would cause the if statement to skip to the return at the bottom of the method, and the method would return 0.Otherwise, [super init] will return the pointer to the object being initialized, which will be assigned to self, and the if statement will execute the code within, finally returning the pointer to self at the end of the method.

Page 22: Objective-C A Beginner's Dive (with notes)

Constructor Example

// default constructor- (id)init { // calls my custom constructor return [self initWithInt:0];}

// custom constructor- (id)initWithInt:(int)myInt { if (self = [super init]) { _myInt = myInt; } return self;}

Saturday, March 9, 13

Page 23: Objective-C A Beginner's Dive (with notes)

Inheritance

• Single Inheritance from Objects

• Method Overloading Supported

• Superclass defined in the Interface

• Super class referenced with super

Saturday, March 9, 13

Page 24: Objective-C A Beginner's Dive (with notes)

Inheritance Example//// MyObject.m// Implementation

#import “MyObject.h”

@implementation MyObject

- (id)init { if (self = [super init]) { _myInt = 5; } return self;}

@end

//// MyObject.h// Interface

#import <Foundation/Foundation.h>

@interface MyObject : NSObject { int _myInt;}

- (id)init;

@end

Saturday, March 9, 13

Here we inherit init from our superclass NSObject.We override init with our own definition.We then call our superclass’s implementation of init using the super keyword.

Page 25: Objective-C A Beginner's Dive (with notes)

Properties

• Syntactic sugar for variable, accessor, and mutator declarations all-in-one

• Properties are declared in the Interface and synthesized in the Implementation

• Let you use “dot syntax” with getters and setters! myObjectInstance.myInt = 5;! int x = myObjectInstance.myInt;

Saturday, March 9, 13

Page 26: Objective-C A Beginner's Dive (with notes)

Property Example//// NSString+Reverse.m// Category

#import "NSString.h"

@implementation MyObject

// creates variable _myInt// creates getter myInt// creates setter setMyInt:@synthesize myInt = _myInt;

@end

//// NSString+Reverse.h// Category

#import <Foundation/Foundation.h>

@interface MyObject : NSObject

@property (assign, nonatomic) int myInt;

@end

Saturday, March 9, 13

This will create an Instance Variable named _myInt with a getter and setter method.

Page 27: Objective-C A Beginner's Dive (with notes)

More on Properties

• Attributesstrong weak copy assign readonlyatomic nonatomic

• @synthesize vs @dynamic!@synthesize variable = nameOfIvar;

• Default ivar name for variable is _variable

• Custom getters and settersgetter = myGetter, setter = mySetter:

Saturday, March 9, 13

strong - holds a retained reference to the assigned object. the assigned object will not be released and deallocated until self is deallocated or the variable is reassigned.weak - if the assigned object is ever released, the variable is set to nil.copy - the variable is set to a copy of the assigned object.assign - used with non-object types. copies the literal value into the variable.readonly - do not generate a setter for this property.readwrite - generate a setter for the property. this is the default.atomic - this is the default. synchronize getting and setting the variable.nonatomic - considered faster than atomic.

@synthesize - generates the getter and setter methods for you. Any you write having the same name override any generated. Synthesize is assumed the default by the compiler and creates an Instance Variable named with an underscore.@dynamic - no automatic generation of getters and setters. The compiler assumes these will be added at runtime. Mostly used when using CoreData.

Page 28: Objective-C A Beginner's Dive (with notes)

Protocols

• Like an Objective-C Interface

• Similar to Java Interfaces

• Can implement multiple Protocols

• Protocols can ‘inherit’ other Protocols

Saturday, March 9, 13

Page 29: Objective-C A Beginner's Dive (with notes)

Example Protocol//// MyProtocol.h// Protocol

#import <Foundation/Foundation.h>

@protocol MyProtocol <NSObject>

@property (assign, nonatomic) int myInt;

- (NSString *)stringMyInt;

@end

//// MyObject.h// Interface

#import <Foundation/Foundation.h>#import "MyProtocol.h"

@interface MyObject : NSObject <MyProtocol>

@end

Saturday, March 9, 13

MyProtocol “inherits” NSObject, and MyObject implements MyProtocol.This means that whatever implements MyPrototcol must also implement all the functionality of NSObject.

Page 30: Objective-C A Beginner's Dive (with notes)

Categories

• The ability to add new methods to an Object

• Changes apply to all instances of the object

• Overwrites any methods that already exist in the class

• Cannot add Properties and ivars

• Can be dangerous

Saturday, March 9, 13

Page 31: Objective-C A Beginner's Dive (with notes)

Example Category//// NSString+Reverse.m// Category

#import "NSString+Reverse.h"#import <stdlib.h>

@implementation NSString (Reverse)

- (NSString *)reverse { int length = [self length]; char *newString = ! ! calloc(length+1, sizeof(char)); int current = 0; const char *cstr = [self cString]; for (int i=length-1; i >= 0; i--) { newString[current] = cstr[i]; current++; } NSString *new = ! ! [NSString stringWithCString:newString]; free(newString); return new;}

@end

//// NSString+Reverse.h// Category

#import <Foundation/Foundation.h>

@interface NSString (Reverse)

- (NSString *)reverse;

@end

Saturday, March 9, 13

This is a category on NSString that adds the method reverse, which returns a reversed string.Now, all implementations of NSString have the method reverse.If NSString already had a reverse method, it is no longer accessible.If another category is added that also has a reverse method, this method implementation will no longer be accessible.

Notice the naming convention of the category Interface and Implementation files.

Page 32: Objective-C A Beginner's Dive (with notes)

Class Extension

• Like Categories, but with the ability to add ivars and Properties

• Implementations of methods required in the main Implementation block

• Can be used to declare “private” methods

Saturday, March 9, 13

In Objective-C, as in C, Public and Private information isn’t compiler managed, but rather, determined by what you as the developer let others see.If you place it in your header file, expect people to see it and look at it. The header file is the forward facing side of your code.If it’s not in your header file, don’t expect anyone to know it exists. Libraries are generally binaries with header files, implementation files are for the developer’s eyes only (generally).

Technically, a spy who knows the implementation could still use a “private” method, but you wouldn’t expect anyone to do that.

Page 33: Objective-C A Beginner's Dive (with notes)

Class Extension Example

//// MyObject.m

// Class Extension@interface MyObject ()

@property (assign) int myPrivateInt;

@end

// Implementation@implementation MyObject

@synthesize myPrivateInt = _myPrivateInt;

// more implementation here

@end

Saturday, March 9, 13

Class Extensions are generally declared within the implementation file before the @implementation block.

Page 34: Objective-C A Beginner's Dive (with notes)

Ok.Now, lets take a look at MyObject

Saturday, March 9, 13

Page 35: Objective-C A Beginner's Dive (with notes)

MyObject//// MyObject.m

#import "MyObject.h"

@interface MyObject ()@property (assign, nonatomic) int myPrivateInt;@end

@implementation MyObject

@synthesize myInt = _myInt;@synthesize myPrivateInt = _myPrivateInt;

- (id)init { return [self initWithInt:0];}

- (id)initWithInt:(int)myInt { if (self = [super init]) { _myInt = myInt;! ! _myPrivateInt = 5; } return self;}

- (NSString *)stringMyInt { return [NSString stringWithFormat:@"%d", _myInt];}

@end

//// MyObject.h

#import <Foundation/Foundation.h>#import "MyProtocol.h"

@interface MyObject : NSObject <MyProtocol>

@property (assign, nonatomic) int myInt;

// default constructor- (id)init;

// custom constructor- (id)initWithInt:(int)myInt;

@end

Saturday, March 9, 13

Here we have an object that holds a public myInt variable and an ‘private’ myPrivateInt variable.Both ivars are accessible through the property ‘dot’ syntax and their getter/setter methods.MyObject fulfills the MyProtocol protocol by implementing the stringMyInt method.The @synthesize statements here were technically unnecessary since they are default.

Page 36: Objective-C A Beginner's Dive (with notes)

GreatBut how do I use it?

Saturday, March 9, 13

Page 37: Objective-C A Beginner's Dive (with notes)

Using MyObject

MyObject *obj = [[MyObject alloc] init];obj.myInt = 5;NSLog(@"%i\n", obj.myInt);

MyObject *other = [MyObject alloc];other = [other initWithInt:5];[other setMyInt:10];NSLog(@"%i\n", [obj myInt]);

Saturday, March 9, 13

Remember: an object instance is a pointer to an instance of its class.

Page 38: Objective-C A Beginner's Dive (with notes)

Using MyObject• alloc class method

• use of init and initWithInt: methods

• splitting up the alloc and init method calls

• use of dot syntax and generated methods

• NSLog() for printing messages to the console

MyObject *obj = [[MyObject alloc] init];obj.myInt = 5;NSLog(@"%i\n", obj.myInt);

MyObject *other = [MyObject alloc];other = [other initWithInt:5];[other setMyInt:10];NSLog(@"%i\n", [obj myInt]);

Saturday, March 9, 13

alloc allocates a new object for you.init (and initWithInt:) initialize that new object for you.These methods together are like the new keyword in Java and C++.(there is a new class method that automatically calls init after alloc, but it’s generally considered better to call alloc and init instead)

The different init methods go to show that init is not super special.

The call to alloc and init don’t need to happen on the same line, but you should always use the result of the init method as your object.

NSLog() is a C Function that takes an NSString and printf style arguments (including %@ to print an object’s description method which returns an NSString). It prints a message to the console.

Page 39: Objective-C A Beginner's Dive (with notes)

One More ThingImports and Forward Declarations

Saturday, March 9, 13

Page 40: Objective-C A Beginner's Dive (with notes)

Imports

• Objective-C introduces the #import Preprocessor Directive#import "MyHeaderFile.h"

#import <SystemHeader.h>

• Guarantees the file is only included once

• Better Practice than C’s #include

Saturday, March 9, 13

Page 41: Objective-C A Beginner's Dive (with notes)

Forward Declarations

• A Promise to the Compiler that a Class or Protocol will exist at Compile Time

@class PromisedObject;

@protocol PromisedProtocol;

• Minimizes the amount of #includes

Saturday, March 9, 13

Page 42: Objective-C A Beginner's Dive (with notes)

Objective-C DataWhat you get with the Foundation Framework

Saturday, March 9, 13

Page 43: Objective-C A Beginner's Dive (with notes)

nil

• Represents the absence of an object

• Messages passed to nil return nil

• nil is for objects, NULL is for C pointers

Saturday, March 9, 13

Unlike Java and C++, there is nothing wrong with calling a method on a nil object.

There’s no real difference between nil and NULL, but it’s bad convention to use them “inappropriately”

Page 44: Objective-C A Beginner's Dive (with notes)

YES and NO

• Boolean type BOOL for “true” and “false”

• Use BOOL with YES and NO

• Dont use _Bool or bool with true and false from stdbool.h

Saturday, March 9, 13

Yet again, there’s no significant difference between C’s _Bool and bool and Objective-C’s BOOL, it’s just better practice to use the Objective-C stuff with Objective-C code.

BOOL is #define’d as an unsigned char, whereas _Bool is a typedef for an int and guaranteed to be only 1 or 0.

Page 45: Objective-C A Beginner's Dive (with notes)

NSNumber

• Object Representation for Integers, Booleans, Floats, Doubles, Characters, etc.

• Object Literal Syntax@1 @1.0 @YES @NO @(1+2) @'a'

Saturday, March 9, 13

Page 46: Objective-C A Beginner's Dive (with notes)

NSString

• Immutable string

• NSMutableString for mutable strings

• Object Literal Syntax@"Hello World!" @("Hello World!")

Saturday, March 9, 13

Immutable means that the data defining the string cannot be modified.Mutable means modifiable.

Page 47: Objective-C A Beginner's Dive (with notes)

NSArray

• Immutable object array

• NSMutableArray for mutable arrays

• Object Literal Syntax@[object1, object2, ..., objectN];

• Object Subscripting Syntaxarray[0] = object;id object = array[0];

Saturday, March 9, 13

The array can only hold Objective-C objects.

Page 48: Objective-C A Beginner's Dive (with notes)

NSDictionary

• Immutable object dictionary

• NSMutableDictionary for mutable

• Object Literal Syntax@{key1:value1, key2:value2, ...};

• Object Subscripting Syntaxdictionary[key] = object;id object = dictionary[key];

Saturday, March 9, 13

Both the key and the value must be an Objective-C object.

Page 49: Objective-C A Beginner's Dive (with notes)

Implementing Array Subscripting

• Accessing ObjectsobjectAtIndexedSubscript:

• Setting ObjectssetObject:atIndexedSubscript:

• The index subscript must be an integral

Saturday, March 9, 13

The indexed subscript is generally an NSUInteger (an unsigned long), but can be any integer type.

Page 50: Objective-C A Beginner's Dive (with notes)

Implementing Dictionary Subscripting

• Accessing Object values with key ObjectsobjectForKeyedSubscript:

• Setting Object values with key ObjectssetObject:forKeyedSubscript:

Saturday, March 9, 13

Page 51: Objective-C A Beginner's Dive (with notes)

Forin Loops

• Loop over the contents of a collection

• Foundation Framework collectionsNSArray NSDictionary

• Any implementation of the NSFastEnumeration Protocol

• Any Subclass of NSEnumerator

Saturday, March 9, 13

NSDictionary will loop through the keys in the dictionary, not the values.I would recommend that if you wanted to make a collection, make a subclass of NSEnumerator (or use an enumerator), it’s easier...

Page 52: Objective-C A Beginner's Dive (with notes)

Forin Loops Example

NSArray *array = @[@1, @2, @3, @4, @5];

for (NSNumber *num in array) { NSLog(@"%@", num);}

for (id num in [array reverseObjectEnumerator]) { NSLog(@"%@", num);}

Saturday, March 9, 13

an array can only hold objects.the first for loop will loop through the array from index 0 to index 4.the second for loop will loop through the array from index 4 to index 0.

Page 53: Objective-C A Beginner's Dive (with notes)

Objective-C Blocks

• Functions you can declare within functions

• Can close-over variables for later use

• Can pass block functions around like data

Saturday, March 9, 13

Page 54: Objective-C A Beginner's Dive (with notes)

Block Syntax

• Similar to C Function Pointer Syntax

return_type (^name)(parameter types) =! ^(parameter list) {! ! // do stuff! };

return_type (^name)() = ^{! ! // do stuff! ! // takes no parameters! };

Saturday, March 9, 13

Page 55: Objective-C A Beginner's Dive (with notes)

Block Exampleint multiplier = 5;int (^mult)(int) = ^(int num){ return num * multiplier;};

int num = mult(5); // num = 25

__block int number = 0;void (^increment)() = ^{ number++;};

increment(); // number = 1increment(); // number = 2

The block itself has read access to variables defined in the lexical scope at the creation of the block.

The block can close over outside variables and modify their values by declaring the variable with the __block modifier.

Saturday, March 9, 13

Page 56: Objective-C A Beginner's Dive (with notes)

Type-Safe Enums• Enums that you can declare the type they enumerate over

• int, char, unsigned char, NSUInteger, ...

• Syntax similar to Object Subclassingtypedef enum MyEnum : NSUInteger { A, B, C} MyEnum;

enum MyUnsignedCharEnum : unsigned char { FIRST, SECOND, THIRD};

typedef enum MyUnsignedCharEnum MyUnsignedCharEnum;

typedef enum : NSUInteger { ONE, TWO, THREE} AnotherEnum;

Saturday, March 9, 13

Page 57: Objective-C A Beginner's Dive (with notes)

Automatic Reference Counting

What it is, and what it means to you

Saturday, March 9, 13

Page 58: Objective-C A Beginner's Dive (with notes)

Referencing Counting

• Nearly-Manual Memory Management

• Objects have a counter showing how many references are using them

• Retain Objects when you receive them[object retain];

• Release Objects when you’re done using them[object release];

• Objects deallocate themselves when their retain count reaches 0

Saturday, March 9, 13

Objects are created with a retain count of 1, so you don’t need to retain objects you just created.

Page 59: Objective-C A Beginner's Dive (with notes)

Automatic Reference Counting (ARC)

• Almost Compile Time Garbage Collection

• Retain and Release messages are added at compile time by the compiler

• ARC manages when to do this for you

• strong variables are Retained when assigned

• weak variables are not Retained on assignment and are zeroed out when deallocated

Saturday, March 9, 13

Page 60: Objective-C A Beginner's Dive (with notes)

Retain Cycle

• Two Objects Reference Each Other

• Their retain counts can never reach 0

• Set one of the references to weak to prevent one of the objects from retaining the other and causing a cycle

Saturday, March 9, 13

Page 61: Objective-C A Beginner's Dive (with notes)

So there you have itObjective-C thrown at you

Saturday, March 9, 13

Page 62: Objective-C A Beginner's Dive (with notes)

Useful References• Programming with Objective-C

http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html

http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/ProgrammingWithObjectiveC.pdf

• Objective-C Cheat Sheet and Quick Referencehttp://cdn5.raywenderlich.com/downloads/RW-Objective-C-Cheatsheet-v1_2.pdf

• Coding Guidelines for Cocoahttp://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.html

http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/CodingGuidelines.pdf

• Ry’s Objective-C Tutorialhttp://rypress.com/tutorials/objective-c/index.html

Saturday, March 9, 13

Programming with Objective-C and Coding Guidelines for Cocoa are Apple documents.Ry’s Objective-C Tutorial is a nice looking piece of documentation.