Sometimes an object can’t be initialized properly without some information from the method that is calling it. For example, imagine that an appliance can’t function without a name. (nil doesn’t count.) In this case, you need to be able to pass the initializer a name to use.
You can’t do this with init because, for now and always, init has no arguments. So you have to create a new initializer instead. Then, when another method creates an instance of Appliance, it would look like this:
Appliance *a = [[Appliance alloc] initWithProductName:@"Toaster"];
The new initializer for Appliance is initWithProductName:, and it accepts an NSString as an argument. ...