Ответ 1
Из Форумы Apple
Правила для назначенных инициализаторов сложны, и я собираюсь подбросить вас в документы для общего случая. Любопытно, что я нашел лучшее объяснение этого раздела "Инициализация" языка Swift Programming, потому что те же понятия применимы как к Swift, так и к Objective-C. В вашем конкретном случае вы должны переопределить -init и не выполнить его во время выполнения. Вы также должны пометить его в своем заголовке NS_UNAVAILABLE, который позволит компилятору поймать это в типичном случае. Вышеизложенное относится к тому, что ваш класс не может работать без модели, и поэтому вы не можете разумно реализовать - любым полезным способом. Если бы вы могли, вы должны. Например, если вы создавали свой собственный строковый объект, для него было бы целесообразно реализовать -init, вызвав super, а затем инициализируя строку пустой строкой.
В ваших файлах .h
:
@interface MyClass : NSObject
- (instancetype)init NS_UNAVAILABLE;
@end
В .m
файлах:
@interface MyClass ()
- (instancetype)init NS_DESIGNATED_INITIALIZER;
@end
@implementation MyClass
- (instancetype)init { @throw nil; }
@end