Por que é “self = [[Rectangle alloc] init]” em um método de classe BAD?

No documento "Objective-C Programming Language" da Apple, a página 48 diz:

+ (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;
}

Um é ruim, um é bom e o outro é excelente. Por que é que?

questionAnswers(3)

yourAnswerToTheQuestion