Я читаю книгу Марка Дэлримпла Изучите Objective-C на Mac (только в главе, посвященной протоколам, все еще относительно новичок) и попытайтесь что-то выяснить:
Зачем вам ссылаться на класс по его собственному имени? Если бы у меня был класс под названием Foo
, почему я бы хотел написать, скажем,
[[Foo alloc] init]
, а не
[[[self class] alloc] init]
Если бы у меня был подкласс Bar, не был бы t первый вариант лишает меня силы писать
[[Bar alloc] init]
, тогда как второй вариант позволил бы это? Когда первый вариант будет лучше?
Обычно в методе класса вы используете [[self alloc] init]
. Например, канонический способ написать удобный метод для класса:
+ (id)fooWithBar:(Bar *)aBar
{
return [[[self alloc] initWithBar:aBar] autorelease];
}
(Обратите внимание, что в методе класса self
относится к объекту класса.)
Однако вы должны использовать [[Foo alloc] init]
(то есть явное имя класса), если вам действительно нужен экземпляр класса Foo
(а не подкласс).
Вы обращаетесь к классу по его имени всякий раз, когда вам нужен именно этот класс. Если подкласс был производным от этого класса, вместо этого этот производный класс представлял бы себя в том же методе. Следовательно, если вы хотите явно создать экземпляр суперкласса, это можно сделать.
Бывают случаи, когда в этом есть смысл. Либо заставить подкласс переопределить метод, чтобы вернуть экземпляр своего класса. Или чтобы вернуть другой класс, например объект-заполнитель, используемый при создании массива NSArray и т. Д.