Say class Kid inherit from class Parent. Size of parent is 100 bytes and size of kid is 200 bytes.
In Kid init, we have self=[super init]
Most of the time it's not a problem. However, once in a while the parent class dealloc the memory allocated for Kid and reallocate another memory for Parent and then give the pointer of the Parent to self
So now, self points to a memory allocated by [super init], which is 100 bytes. But Kid needs 200 bytes
Let me guess, does [super init] return Parent or a Kid class?
If [super init] return Kid class, how do super knows that it's being called by the Kid class?
This is completely wrong.
No normal init method allocates memory for the new object (self in -init). The +alloc class-method is where memory is allocated for a new object.
If [[Kid alloc] init] is written, then Kid's init receives a self object with 200 bytes.
If [[Parent alloc] init is written, then Parent's init receives self of 100 bytes.
When Kid's init calls [super init], the Parent init method initializes the 100 bytes that are common with Parent objects. Since Parent has no knowledge of any other bytes, it can't initialize them. When [super init] returns, the remainder of Kid's init should initialize the bytes that are unique to Kid objects. It can also override the initialization of some or all that [super init] performed.
Developer-extensible classes whose -init doesn't return the original self are uncommon, and require advanced knowledge to write properly. When they exist, their documentation describes how they should be sub-classed.
You really need to review the fundamentals of Objective-C and Cocoa:
Cocoa Fundamentals Guide
If you're not learning from a book or tutorial, I recommend that you do so. If you're already doing this, post exactly which book or tutorial you're using: title, author, url.