Two Staged Creation of objects in Cocoa and Objective C
This was changed, because of the need of several different allocation strategies to cup with the stringent memory limitations of that time. This is how allocWithZone: was born: to keep frequently used objects close to each other in memory.
Having several allocation methods and several instance initialization methods was causing a combinatorial explosion, so both responsibilities were decoupled.
Why we still need [[… alloc] init] in Objective C
Currently, there’s no need for zones and they are deprecated, however, there’s still a reason to keep the two-staged creation: Cocoa has no GC (at least for iOS) so the programmer MUST know when he allocates non-autoreleased memory!
This is the only reason for keeping the two-staged allocation strategy. Smalltalk and Java, having a GC have no need for this.