Правильно ли вызывать [super init] в методе init?

В файле Microsoft WinObjC UIApplication.mm (по адресу https://github.com/Microsoft/WinObjC/blob/master/Frameworks/UIKit/UIApplication.mm) init Метод реализован для обоих UIApplication а также WOCDisplayMode,

Ни один класс init вызовы методов [super init]или любой метод из этого семейства методов, который в конечном итоге приведет к вызову [super init], Я никогда не видел этого раньше, кроме инициализации NSProxy объекты.

Я воспроизвел реализацию на момент написания WOCDisplayMode ниже для справки.

-(instancetype) init
{
    _fixedWidth = 320.0f;
    _fixedHeight = 480.0f;
    _fixedAspectRatio = 0.0f;
    _magnification = 1.0f;
    _autoMagnification = TRUE;
    _sizeUIWindowToFit = TRUE;
    _operationMode = WOCOperationModePhone;
    return self;
}

Мне кажется, что это может создать ряд проблем; например, если один из суперклассов UIApplication, лайк UIResponderв какой-то момент перерос init и установить внутреннее состояние, от которого зависят будущие вызовы методов.

Почему разработчик решил не звонить [super init]? Это когда-либо оправданное решение? Это когда-нибудь правильный?

1 ответ

Решение

Это определенно похоже на ошибку от имени автора (ов) этих классов.

NSProxy не звонит [super init] потому что это абстрактный суперкласс и не наследуется от NSObject,

С момента их реализации UIApplication наследуется от UIResponder, а также WOCDisplayMode наследуется от NSObject они должны звонить [super init] в этих классах.

Согласно документации по инициализации объекта:

Важным является требование вызвать инициализатор суперкласса в качестве первого действия. Напомним, что объект инкапсулирует не только переменные экземпляра, определенные его классом, но и переменные экземпляра, определенные всеми его классами-предками. Вызывая инициализатор super first, вы помогаете убедиться, что переменные экземпляра, определенные классами в цепочке наследования, инициализируются первыми. Непосредственный суперкласс в своем инициализаторе вызывает инициализатор своего суперкласса, который вызывает основной метод init... его суперкласса и т. Д. (См. Рис. 6-1). Правильный порядок инициализации имеет решающее значение, поскольку последующие инициализации подклассов могут зависеть от переменных экземпляра, определенных суперклассом, которые инициализируются до приемлемых значений.

Я бы порекомендовал зарегистрировать его как проблему в проекте.

Другие вопросы по тегам