Can someone explain to me what init and alloc do in Obj-C. I am reading this obj-c book that gives an example of creating object but it does not really go into details of what it does. What does alloc return? what does init return?
Animal * k = [Animal alloc]; k = [k init];
Alloc allocates memory for the instance, and init gives it's instance variables it's initial values. Both return pointers to the new instance, hence the method chain.
In its simplest form: alloc: short for allocation, reservers a memory location and returns the pointer to that memory location. This pointer is then stored in the k variable. init: short for initialization, sets up the object and returns the object.
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 from a
. That explains the code Yannick wrote:
-init{ self=[super init]; // 1. if(self){ // 2. .... } return self; // 3. }
init
, to setup the superclass's instance variables, etc. That might return something not equal to the original self
, so you need to assign what's returned to self
. 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 to nil
(if it's object) and 0
if it's integer. You'll need to perform additional initial settings. self
. The returned self
might be different from what's allocated! So, you need to assign the result of init
to your variable.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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With