Какая точка использования [self class]

Правильно ли этот код

@implementation Vehicle
+(id) vehicleWithColor:(NSColor*)color {
    id newInstance = [[[self class] alloc] init]; // PERFECT, the class is // dynamically identified
    [newInstance setColor:color];
    return [newInstance autorelease];
}
@end

Зачем использовать [self class]

Я думал, что я уже указывает на класс на статические методы (те, у которых +)

Ответы

Ответ 1

Вы правы: [self class] не нужен в методе класса (его чаще называют в Objective-C, а не в методе static), потому что self уже является классом, а [self class] возвращает себя.

Но это становится немного интереснее. В Objective-C объекты класса являются технически экземплярами метаклассов. Поэтому [self class] в методе класса должен возвращать метакласс вместо самого класса. Но для практических целей Objective-C скрывает метакласс, поэтому он специально обрабатывает этот случай.

Некоторые хорошие чтения по этой теме:

Ответ 2

Он поддерживает подклассы. Если вы жестко закодировали имя класса, как в [[Vehicle alloc] init], тогда подкласс транспортного средства должен будет переопределить + vehicleWithColor: чтобы он делал правильные действия. С помощью [self class] вы можете создать подкласс HarleyDavidson, а [HarleyDavidson vehicleWithColor:[NSColor blackColor]] выполнит правильную работу автоматически, создав экземпляр HarleyDavidson вместо экземпляра Vehicle.

( Edit:)

См. комментарий Джо ниже self vs. [self class] в методах класса. В методах класса это не имеет значения. Но есть такая ситуация, когда это возможно. Классы могут отвечать на методы экземпляров, которые определены в корневом классе - сам по себе -class - это именно такой метод, определенный как метод экземпляра в протоколе NSObject. Поэтому, если вы расширите класс корня, например NSObject, добавив метод экземпляра, этот метод всегда должен использовать [self class], если ему нужно ссылаться на свой собственный объект класса.