Dlaczego „self = [[Rectangle alloc] init]” w metodzie klasy BAD?

W dokumencie „Objective-C Programming Language” firmy Apple strona 48 mówi:

+ (Rectangle *)rectangleOfColor:(NSColor *) color
{
    self = [[Rectangle alloc] init]; // BAD
    [self setColor:color];
    return self;
}

+ (id)rectangleOfColor:(NSColor *)color
{
     id newInstance = [[Rectangle alloc] init]; // GOOD
     [newInstance setColor:color];
     return newInstance;
}


+ (id)rectangleOfColor:(NSColor *)color
{
     id newInstance = [[self alloc] init]; // EXCELLENT
     [newInstance setColor:color];
     return newInstance;
}

Jeden jest zły, drugi dobry, a drugi doskonały. Dlaczego?

questionAnswers(3)

yourAnswerToTheQuestion