-
alloc
allocates a chunk of memory to hold the object, and returns the pointer.MyClass* myObj = [MyClass alloc];
myObj
cannot be used yet, because its internal state is not correctly setup. So, don’t write a code like this. -
init
sets up the initial condition of the object and returns it. Note that what’s returned by[a init]
might be different froma
. That explains the code Yannick wrote:-init{ self=[super init]; // 1. if(self){ // 2. .... } return self; // 3. }
- First, you need to call the superclass’s
init
, to setup the superclass’s instance variables, etc. That might return something not equal to the originalself
, so you need to assign what’s returned toself
. - If
self
is non-nil, it means the part controlled by the superclass is correctly initialized. Now you perform your initialization. All of the instance variables are set tonil
(if it’s object) and0
if it’s integer. You’ll need to perform additional initial settings. - Return the set-up
self
. The returnedself
might be different from what’s allocated! So, you need to assign the result ofinit
to your variable.
- First, you need to call the superclass’s
This suggestions an important lesson: never split the call to alloc
and init
. Don’t write:
MyClass* myObj = [MyClass alloc];
[myObj init];
because [myObj init]
might return something else. Don’t try to get around this by writing:
MyClass* myObj = [MyClass alloc];
myObj=[myObj init];
because you will eventually forget to write the part myObj=
in the second line.
Always write:
MyClass* myObj = [[MyClass alloc] init];
I also don’t recommend writing:
MyClass* myObj = [MyClass new];
because it does not correctly call the initialization method: some classes doesn’t accept a plain init
. For example, NSView
needs initWithFrame:
, which can’t be called with new
. So, don’t use new
either.