ObjC: в init я могу сделать self = [self initWithMyGenericMethod]?

В моем классе у меня есть общий инициализатор:

- (id)initWithSettings:(MySettings *)settings
{
    self = [super init];
    if (self)
    {
     /// ...
    }
    return self;
}

И у него есть другой инициализатор с фиксированной настройкой

- (id)initWithSettingsForCaseA
{
    return [self initWithSettings:[MySettings genericSettings]];
}

Я могу сделать это?

1
nl ja de
Все в порядке.
добавлено автор rmaddy, источник
Это все хорошо, но если initWithSettingsForCaseA является инициализатором по умолчанию, и если вы не реализуете init , вы можете также переименовать initWithSettingsForCaseA в INIT . Меньше шансов на то, что ваш инициализатор не будет вызван.
добавлено автор John Estropia, источник

1 ответы

Конечно вы можете!

Это на самом деле хорошая практика.

initWithSettings: называется «назначенным инициализатором». Нет программного способа определения назначенного инициализатора. Это скорее модель дизайна/лучшая практика.

Возьмем, к примеру, назначенный инициализатор для UIViewController, initWithNibName: bundle: .. вы все равно можете вызвать plain ol 'init, и все будет работать нормально, пока ваш ниб назван так же, как ваш подкласс класса просмотра. UIViewController просто вызывает свой назначенный инициализатор и передает nil для обоих параметров.

Вы по существу делаете то же самое!

2
добавлено
Спасибо за ответ, но я подумал, что self = [super init] создаст self , который нам нужно проверить, не является ли это nil, поэтому в этом случае self = [self initWithSomething] , внутренняя скобка self еще не инициализирована.
добавлено автор hzxu, источник
@jmstone Но тогда почему вам все еще нужно проверить if (self) {} ? Итак, есть ли шанс, что я может быть нулевым? Если это так (т.е. после self = [super init] ), то как я могу убедиться, что self внутри скобки self = [self initWithSettings: ...] не нуль?
добавлено автор hzxu, источник
self еще не инициализирован, пока вы не назовете [super init], который возвращает инициализированный экземпляр вашего класса. Если ваш класс наследуется от класса UIKit/Foundation, вы можете быть уверены, что [super init] вернет действительный экземпляр. [self initWithSettings:] вернет инициализированный экземпляр, поэтому возвращение из initWithSettingsForCaseA совершенно верно
добавлено автор jmstone617, источник
Вы проверяете, не является ли само по себе отсутствием наилучшей практики и b) для безопасности. Предполагая, что ваш класс наследуется от NSObject, вам не нужно беспокоиться о том, где self no nil из [super init]. Если это когда-нибудь случится, у нас все проблемы. Вам нужно будет проверить, наследуется ли вы от класса, который сделал какую-то неуклюжую инициализацию. Если по какой-то причине это не удалось, и объект не был правильно инициализирован, время выполнения обязательно сообщит вам об этом, и вы сможете вернуться и исправить код нарушения
добавлено автор jmstone617, источник
Объект создается во alloc , а не init . Методы init просто устанавливают начальное состояние уже созданного объекта.
добавлено автор mttrb, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.