Правильно ли вызывать [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). Правильный порядок инициализации имеет решающее значение, поскольку последующие инициализации подклассов могут зависеть от переменных экземпляра, определенных суперклассом, которые инициализируются до приемлемых значений.
Я бы порекомендовал зарегистрировать его как проблему в проекте.