Initializing Objects

Your AwesomeStringMaker class has a bug. Hard to imagine, isn't it?

AwesomeStringMaker *myAwesomeStringMaker = [[[AwesomeStringMaker alloc] init]
autorelease];
myAwesomeStringMaker.originalString = @"typing power";
NSString *myAwesomeString = [myAwesomeStringMaker awesomeString];

The value for myAwesomeString is "TYPING POWER". It's missing some awesome exclamation points!!!!! That's because when a new instance of an object is created, all instance data is cleared out. Pointers are set to nil values and numbers are set to zero. This means your exclamationCount instance variable is zero. And you can't be awesome with zero exclamation points.

This situation illustrates a larger problem: Your objects usually need to be set up before you can send them messages. With Objective-C, there's a method for just that:

- (id)init {
    if (self = [super init]) {
        // WHY USE A LITTLE WHEN YOU CAN USE A LOT
        exclamationCount = [[NSNumber numberWithInt:8] retain];
        originalString = [@"" copy];
   }
   return self;
}

That code may look convoluted, but what it does is simple and elegant: After every object is allocated in memory, the new instance is sent the –init message. You can choose to ignore the message, but it's more likely that you won't.

Note

You may be wondering why every object gets sent the –init message. It's because the default implementation is in NSObject, and every object is a descendent of this root class. If you don't implement the method, it will be handled by superclasses, including ...

Get iPhone App Development: The Missing Manual now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.