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

Я читаю книгу Марка Дэлримпла Изучите Objective-C на Mac (только в главе, посвященной протоколам, все еще относительно новичок) и попытайтесь что-то выяснить:

Зачем вам ссылаться на класс по его собственному имени? Если бы у меня был класс под названием Foo , почему я бы хотел написать, скажем,

[[Foo alloc] init]

, а не

[[[self class] alloc] init]

Если бы у меня был подкласс Bar, не был бы t первый вариант лишает меня силы писать

[[Bar alloc] init]

, тогда как второй вариант позволил бы это? Когда первый вариант будет лучше?

17
задан Gilles 'SO- stop being evil' 28 June 2012 в 08:52
поделиться

2 ответа

Обычно в методе класса вы используете [[self alloc] init] . Например, канонический способ написать удобный метод для класса:

+ (id)fooWithBar:(Bar *)aBar
{
    return [[[self alloc] initWithBar:aBar] autorelease];
}

(Обратите внимание, что в методе класса self относится к объекту класса.)

Однако вы должны использовать [[Foo alloc] init] (то есть явное имя класса), если вам действительно нужен экземпляр класса Foo (а не подкласс).

27
ответ дан 30 November 2019 в 12:06
поделиться

Вы обращаетесь к классу по его имени всякий раз, когда вам нужен именно этот класс. Если подкласс был производным от этого класса, вместо этого этот производный класс представлял бы себя в том же методе. Следовательно, если вы хотите явно создать экземпляр суперкласса, это можно сделать.

Бывают случаи, когда в этом есть смысл. Либо заставить подкласс переопределить метод, чтобы вернуть экземпляр своего класса. Или чтобы вернуть другой класс, например объект-заполнитель, используемый при создании массива NSArray и т. Д.

7
ответ дан 30 November 2019 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: