Это поддержка подклассов. Если вы жестко закодировали имя класса, как в [[Vehicle alloc] init]
, то подкласс класса Vehicle должен был бы переопределить + vehicleWithColor: чтобы он действовал правильно. С [self class]
вы можете создать подкласс HarleyDavidson, а [HarleyDavidson vehicleWithColor:[NSColor blackColor]]
будет делать все правильно, создавая экземпляр HarleyDavidson вместо экземпляра Vehicle.
( Редактировать :)
См. Комментарий Джо, касающийся self
против [self class]
в методах класса. В методах класса это не имеет значения. Но есть ситуация, когда это возможно. Классы могут реагировать на методы экземпляров, которые определены в корневом классе - -class
сам по себе является именно таким методом, определенным как метод экземпляра в протоколе NSObject. Поэтому, если вы расширяете корневой класс, такой как (например) NSObject, добавляя метод экземпляра, этот метод всегда должен использовать [self class]
, если ему нужно сослаться на свой собственный объект Class.