2014-09-14 2 views
1

Итак, у меня есть класс с назначенным инициализатором, который принимает значения для каждого хранимого свойства. Все мои сохраненные свойства также имеют значения по умолчанию, поэтому я предполагаю, что этот класс получит init по умолчанию.Почему вызов super.init() вызывает мой init init()

В моем назначенный инициализации я называю super.init()

Проблема заключается в том, если я называю это в конце моей инициализации, он загружает все свойства значения по умолчанию, но если я называю это на начните работу, как я ожидаю.

В книге говорится:

безопасность проверка 1 Назначенного инициализатор должен обеспечить, чтобы все свойства введенного его классом инициализируется перед делегатами до суперкласса инициализатора.

Как уже упоминалось выше, память для объекта рассматривается полностью , как только начальное состояние всех сохраненных им свойств является . Для того чтобы это правило было выполнено, назначенный инициализатор должен убедиться, что все его собственные свойства инициализированы , прежде чем он отключит цепочку.

Так что я не уверен, что все изменилось, или я что-то делаю неправильно?

Код:

class ORQuizViewController: UIViewController { 
let imageView: UIImageView = UIImageView(image: nil) 
let questionLabel: UILabel = UILabel() 
let choicesArray: [BlackWhiteButton] = [BlackWhiteButton]() 
let correctAnswer: Int = -1 

init(image: UIImage!, question: String, choices: [String], answerIndex: Int) { 
    super.init() 
    imageView = UIImageView(image:image) 
    questionLabel = UILabel() 
    questionLabel.text = question 
    var tempChoices = [BlackWhiteButton]() 
    for choice in choices { 
     var choiceLabel = BlackWhiteButton() 
     choiceLabel.setTitle(choice, forState: .Normal) 
     tempChoices.append(choiceLabel) 
    } 
    choicesArray = tempChoices 
    correctAnswer = answerIndex 
} 
+0

Являются ли свойства, определенные этим классом, или они унаследованы от суперкласса? – Paulw11

+0

Они определены этим классом, поэтому на основе документа Apple я должен быть инициализирован перед вызовом super. –

+0

Является ли ваш инициализатор помеченным как удобство или это назначенный инициализатор? – Paulw11

ответ

-3

Я предполагаю, что это Objective C, и я не знаком с этим языком, но если говорить о работе объектно-ориентированных языков программирования в целом, конструкторы/инициализаторы и должны вызываться от наименее производного класса до самого производного класса и деструкторов в обратном порядке.

Подумайте об этом таким образом, если базовый класс - это торт, а ваш производный класс добавляет обледенение, вы не можете положить глазурь на место до того, как будет создан торт.

Что касается значения инструкции из книги, в то время, когда вы вызываете инициализацию, если виртуальные функции уже указывают на функциональность вашего производного класса, то ваш класс должен быть инициализирован до того, как вы получите виртуальные функции, называемые ,

В языках C++ и C# язык выделяет объект, инициализирует наименее производный компонент, передает виртуальные функции первому производному классу и затем конструирует его и т. Д. Классы не вызывают инициализаторы суперкласса.

Я знаю, что не ответил на ваш вопрос, но, возможно, это поможет вам разобраться в ответе. При первом вызове super.init(), если вы собираетесь называть super.init(), это будет правильный курс действий.

Возможно, это ответ: если виртуальные функции указывают на ваши переопределения, которые они должны, но вы должны вызвать super.init(), тогда вам нужно будет инициализировать свои данные в случае, когда вызывается виртуальная функция , вызовите super.init(), чтобы инициализировать внутренний класс, а затем продолжить процесс инициализации. Все это звучит очень небезопасно для меня, но я не вижу другого способа, которым это могло бы работать.

+0

Ваш ответ описывает общие идеи компании и понимает, что вы пытаетесь сказать, но мой вопрос относится конкретно к Swift, который делает вещи несколько иначе. –

1

Правильное решение - позвонить по телефону super.initдо. Вы определяете конечные значения, как вы это заметили.Проверка безопасности 1, как вы сказали, требует, чтобы все свойства, введенные подклассом, были инициализированы до делегирования - это касается ваших назначений по умолчанию.

Проверка безопасности 1 применяется во время фазы 1 процесса инициализации.

Фаза 2 процесса инициализации происходит затем -

Фаза 2

Работа вниз от верхней части цепи, каждый назначенный инициализатор в цепи имеет возможность настроить пример далее. Инициализаторы теперь могут получить доступ к себе и могут изменять свои свойства , вызывать его методы экземпляра и т. Д. Наконец, любые инициализаторы удобства в цепочке имеют возможность настроить экземпляр и работать с самим собой.

Таким образом, вы должны присвоить окончательные значения во время фазы 2.

Документация немного непонятно, но, кажется, что вы должны продолжать использовать типичную конвенцию от Objective C вызова суперкласса инициализации первого ,

Смежные вопросы