Должны ли вы переопределять init при создании нового назначенного инициализатора?
Я прочитал довольно много о назначенных и удобных инициализаторах в objective-c
и я чувствую, что хорошо понимаю, как и почему они используются. У меня просто пара нерешенных вопросов, ну один действительно.
Скажем, у вас есть класс, который наследует непосредственно от NSObject
и вы создаете назначенный инициализатор для него.
Я понимаю, что теперь вы можете пометить свой назначенный инициализатор, используя NS_DESIGNATED_INITIALIZER, но мне интересно, означает ли это, что это заставляет вас отдельно, внутри одного и того же класса, сначала переопределить init с помощью вызова ваших назначенных инициализаторов?
Во-вторых, если бы вы не использовали этот макрос, что может означать, что НЕ будет явно переопределять init при обращении к указанному инициализатору? Я понимаю, что компилятор не знал бы, какой инициализатор был назначен, так что из этого может получиться что-то плохое, и является ли хорошей практикой переопределение init при создании нового назначенного инициализатора для вашего класса?
РЕДАКТИРОВАТЬ: Я просто хочу добавить дополнительные разъяснения по этому вопросу. Я видел примеры хороших кодеров, не добавляющих отдельный метод для переопределения init, несмотря на добавление назначенного инициализатора их собственного создания. Когда я спрашиваю, следует ли вам переопределить init, я имею в виду не только создание собственного специального назначенного инициализатора, который, конечно, должен вызывать метод init его суперкласса. Я видел, как хороший кодер этого не делал, и поэтому я удивился, почему вы это сделаете.
1 ответ
теперь вы можете пометить ваш назначенный инициализатор с помощью NS_DESIGNATED_INITIALIZER, но мне интересно, означает ли это, что это заставляет вас отдельно, в пределах одного класса, сначала переопределить init с вызовом вашего назначенного инициализатора?
Вызов любого инициализатора самостоятельно обойдёт предупреждение. Когда я пытаюсь вызвать метод super.init, я получаю следующее предупреждение.
В инициализаторе удобства отсутствует вызов "self" другому инициализатору.
что может означать, что не будет явно переопределять init при обращении к указанному инициализатору?
Это может означать, что в вашем объекте может отсутствовать некоторая важная информация, которая требуется ему для функционирования, или что приложение предполагает, что объект всегда есть, и, если у него его нет, это может вызвать ошибки или сбой в вашем приложении.
Вот хорошее объяснение того, как это работает:
http://timekl.com/blog/2014/12/09/objective-cs-designated-secret/