UPDATE: domanda e titolo sono stati riformulati in base alle modifiche apportate in risposta alla domanda iniziale.Impossibile chiamare l'inizializzatore per sottoclasse di tipo generico
Ho una classe base che implementa un metodo di classe generico per la creazione di nuove istanze. La logica semplificata di questo metodo di classe è la seguente
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)
}
}
ho quindi implementare una sottoclasse di questa classe di base con logica come la seguente
class MySubClass : MyBaseClass {
required init(_ record:MyRecordType) {
println("Entered MySubClass.init")
// Initialize subclass from record
super.init(record)
}
}
Avanti, provo a richiamare il metodo classe generica
Quando si crea un'istanza della classe, la riga contrassegnata da un commento che identifica la posizione di arresto anomalo, mi aspetto il metodo init da MySubClass
a essere invocato. (Questa strana notazione si basa sulla soluzione di bug suggerita nelle risposte)
Invece di chiamare il metodo init
per MySubClass
, questo codice si arresta in modo anomalo con un BAD_ACCESS. Non sono stato in grado di trovare riferimenti nulli o qualsiasi altra cosa che spiegasse questo incidente.
Non riesco a riprodurre BAD_ACCESS. Presumo che tu stia usando una chiamata asincrona, forse il problema è lì intorno. – rintaro
@rintaro - Sono finalmente riuscito a isolare il problema. Risulta essere non correlato all'asincronia e invece si riferisce al mix di un inizializzatore sovrascritto con un inizializzatore richiesto (pubblicherò una descrizione completa sotto). Poiché è stata la tua risposta che almeno mi ha indicato nella giusta direzione mi piacerebbe darti il giusto credito per la risposta qui, ma sembra che tu abbia cancellato la tua risposta. Sentiti libero di ripubblicarti se vuoi che ti dia credito per il tuo aiuto. –