Что такое использование [super init]
в методах по умолчанию Objective-C и каковы условия, в которых мы можем использовать его в наших пользовательских методах?Когда использовать [Super init] iOS
ответ
Чтобы сделать его коротким:
A. Каждый класс имеет один (обычно) или более первичные (назначенные) Инициализаторы. Прежде чем выполнять свою инициализацию, вы должны выполнить один из основных инициализаторов супер. Например, в NSObject
-init
является основным инициализатором. Если у вас есть подкласс NSObject
вы должны выполнить init
(NSObject
), прежде чем сделать свою собственную инициализацию:
@interface MyClass : NSObject
…
@end
@implementation MyClass
- (id)init // My primary initializer
{
// Before I do my own -init, if have to execute super's -init
self = [super init];
…
}
@end
Это справедливо, если ваш подкласс имеет новый первичный инициализатору:
@interface MyClass : NSObject
…
@end
@implementation MyClass
- (id)initMyClassWith… // My primary initializer, that's different from NSObject's
{
// Before I do my own -initMyClass, if have to execute super's -init
self = [super init];
// As long, as -init is not overridden, self-init would work by acdident,
// but you have to override on a PI change, see below!
…
}
@end
Вы делаете не отправить init
в super
(более общий: выполнить PI супер), когда у вас есть удобный инициализатор. В этом случае вы посылаете сообщение для себя:
@interface MyClass : NSObject
…
@end
@implementation MyClass
- (id)initConvenient // My secondary initializer
{
self = [self initMyClass]; // primary
…
}
@end
Поэтому на изменения ПИ, вы должны переопределить PI супер, чтобы сделать его выполнить подкласс PI:
@interface MyClass : NSObject
…
@end
@implementation MyClass
- (id)init // subclass' secondary
{
self = [self initMyClass]; // Primary
…
}
@end
Вы должны использовать super init
, когда вы переопределяете инициализатор из своего суперкласса. Например, если вы являетесь подклассом UIViewController
, вы вызываете [super init]
, а затем добавляете свой код инициализации.
Чтобы быть более точным: Нет, во многих случаях вам не нужно отправлять сообщение «супер», иногда это ломает вещи. Но верно для '-init ...'. –
На самом деле он спрашивает об инициализаторах. И там вам нужно вызвать super init. –
Я изменил свой комментарий. Но это все еще не так, потому что вы выполняете init init только в основном инициализаторе. Если это вторичный инициализатор (удобный инициализатор), вы должны выполнить первичный инициализатор 'self'. –
Вы используете [super init]
во всех подклассах, которые вы реализуете, которые также имеют метод -init, -initWith ....
Это означает, что код родительского класса выполняется до вашего.
- 1. Self = [super init]
- 2. super init возвращает nil
- 3. Super init in Swift
- 4. Когда использовать alloc init
- 5. Вызов init в init, перед self = [super init]
- 6. Назначение if (self == [super init])
- 7. super init больше не работает
- 8. Super init vs. parent .__ init__
- 9. Могу ли я использовать assert() для обнаружения сбоя [super init]?
- 10. Нужно ли использовать super() .__ init __() в этом случае?
- 11. Зачем использовать [super init] в конструкторах Objective C?
- 12. Что делать, если [super init] возвращает nil?
- 13. Почему в Objective-C мы используем self = [super init] вместо просто [super init]?
- 14. Когда использовать init() при создании UIViewController?
- 15. Вызывает [self init] OK в пользовательских методах init Object C, если init вызывает [super init]?
- 16. super init Sprites не поддерживает позицию
- 17. Objective-c - что возвращает [super init]?
- 18. Objective-c: Вопросы о self = [super init]
- 19. Когда я использую super()?
- 20. iOS NavigationCotroller pushViewController, когда init с UITabBarViewController
- 21. Когда вы будете использовать параметры сервлета init?
- 22. Когда использовать Application_Start vs Init в Global.asax?
- 23. Способ вызова super (MyClass, self) .__ init __() без MyClass?
- 24. Как использовать super();
- 25. Почему мне нужно использовать [super% methodname%] в iOS?
- 26. iOS: UIView subclass init вызовет [super init], затем вызовет методы в суперклассе, почему он будет вызывать [subclass initWithFrame: xx]?
- 27. iPhone - использование самости = [супер INIT], когда [супер INIT] не
- 28. Что делать, если вы не можете вызвать [super init] вначале
- 29. Когда нужно вызвать супер() .__ init __()?
- 30. Задача C самоопределяется родителем после выполнения self = [super init]?
«primary» называется «обозначенным». – Sulthan
Зависит от возраста документации: Ранее Apple использовала «обозначенные» и «вторичные». В наши дни Apple использует «назначенные» и «удобные». До этого я переключаюсь на «первичный» и «вторичный», чтобы последовательно именовать. Бьюсь об заклад, в следующей версии ОС снова появляются новые имена. ;-) –
Добавил его, чтобы сделать его совместимым с документами Apple. Спасибо. –