ОБНОВЛЕНИЕ: Вопрос и название были пересчитаны на основании изменений, которые были сделаны в ответ на исходный вопрос.Невозможно вызвать инициализатор для подкласса типового типа
У меня есть базовый класс, который реализует универсальный метод класса для создания новых экземпляров. Упрощенная логика этого метода класса заключается в следующем
class MyBaseClass {
required init(_ record:MyRecordType) {
println("Entered MyBaseClass.init")
// Initialize base class from record
}
class func retrieveInstance<T:MyBaseClass>(name:String, callback:(T) ->()) {
let myRecord:MyRecordType = ... // Perform fetch to get a record for name
let result = (T.self as T.Type)(myRecord) // Code currently crashes with BAD_ACCESS at this line
callback(result)
}
}
Я тогда реализовать подкласс этого базового класса с логикой как следующий
class MySubClass : MyBaseClass {
required init(_ record:MyRecordType) {
println("Entered MySubClass.init")
// Initialize subclass from record
super.init(record)
}
}
Далее, я пытаюсь вызвать метод общего класса
class AnotherClass {
func successCallback(result:MySubclass) {
// Handle callback
}
MySubClass.retrieveInstance("objectName", callback:successCallback)
}
При создании экземпляра класса - строки, помеченной комментарием, идентифицирующим местоположение сбоя - я ожидаю, что метод init от MySubClass
до вызывается. (Это нечетное обозначение основано на обходном пути ошибки, предложенном в ответах)
Вместо вызова метода init
для MySubClass
этот код вылетает с BAD_ACCESS. Я не смог найти ничтожные ссылки или что-то еще, что могло бы объяснить эту катастрофу.
Я не могу воспроизвести BAD_ACCESS. Я предполагаю, что вы используете какой-то асинхронный вызов, может быть, проблема там. – rintaro
@ rintaro - Наконец-то я смог изолировать проблему. Он оказывается не связанным с асинхронностью и вместо этого относится к смешению переопределенного инициализатора с требуемым инициализатором (я опубликую полное описание ниже). Поскольку это был ваш ответ, по крайней мере, я указал в правильном направлении, я хотел бы дать вам правильный ответ, но вы, кажется, удалили свой ответ. Не стесняйтесь пересказывать, если вы хотите, чтобы я дал вам кредит на вашу помощь. –