Какой смысл использовать [собственный класс] - PullRequest
15 голосов
/ 14 апреля 2011

Является ли этот код правильным

@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 уже указывает на класс на статических методах (с +)

Ответы [ 2 ]

19 голосов
/ 14 апреля 2011

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

( Редактировать :)

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

18 голосов
/ 14 апреля 2011

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

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

Хорошее прочтение на эту тему:

...