Sorprendentemente, ho fatto pista questo in giù, per lo più cancellando il codice in grandi campioni fino a quando ero giù a proprio questo (si tratta di un controller di vista):
class LessonListController: UIViewController {
var terms : [Term]
// var terms : NSArray
init(terms data:NSArray) {
let arr = data.sortedArrayUsingDescriptors([NSSortDescriptor(key: "lessonSection", ascending: true)])
self.terms = arr as! [Term]
// self.terms = arr
super.init(nibName:"LessonList", bundle:nil)
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@IBAction func doDismiss(sender: AnyObject) {
self.dismissViewControllerAnimated(true, completion: nil)
}
}
Se (in una build Release) abbiamo presenta questo controller di visualizzazione e poi lo abbandona, si arresta in modo anomalo - in dealloc, che dimostra la mia teoria che si tratta di un problema con la gestione della memoria.
Dopo aver isolato il codice, sono riuscito a provare varie alternative. È chiaro che il problema è la proprietà var terms : [Term]
(perché l'unica cosa che Swift sta facendo sotto il cofano in dealloc
sta rilasciando questa matrice). Il valore di questa proprietà, come puoi vedere nel mio init
, è un NSArray proveniente da Cocoa (tramite sortedArrayUsingDescriptors
) ed è stato trasmesso a un array Swift. Per tentativi ed errori, ho scoperto:
Se cambiamo l'implementazione in modo che la proprietà è un NSArray (vedere le linee alternative commentate-out), non crash.
Oppure, se non lo ordiniamo (in modo che questo NSArray non provenga da Cocoa), non si arresti.
Oppure (attendere), se sostituiamo self.terms = arr as! [Term]
con self.terms = arr as NSArray as! [Term]
, non si arresta in modo anomalo!
Ma quella terza alternativa è una soluzione. Ho passato tutto il mio codice in tutte le mie app cercando i caste li ho sostituiti tutti con as NSArray as [SomeType]
e tutti i miei arresti sono andati via !!
mia teoria è che qualcosa sta andando storto con la gestione della memoria di Swift nella build di rilascio ottimizzato proprio nella situazione molto particolare in cui un NSArray arriva da cacao ed è ponte per noi un [AnyObject]
prima del nostro codice può entrare in possesso di esso . Un tale NSArray non sta attraversando il ponte correttamente.Ma colando su NSArray e poi tornando allo specifico array [SomeType]
Swift, il problema è risolto.
Naturalmente, presumo che quando Apple lo analizzerà, lo risolveranno e quindi possiamo smettere di usare questa soluzione alternativa. Ma fino ad allora, le mie app sono in esecuzione in una build Release ancora una volta.
E il mio numero di segnalazione bug è 19835848. Quindi, se lo vedi nelle tue app e vuoi segnalarlo, puoi fare riferimento al mio rapporto, se lo desideri. – matt
questo capita anche a me, con una stringa. non ho ancora trovato una soluzione alternativa – alexdd55
@ alexdd55 Ho sentito parlare della versione String del problema ma non l'ho visto. Mi piacerebbe. Hai un caso riproducibile? (E hai presentato una segnalazione di bug con Apple?) – matt