2015-02-14 16 views
10

Dopo l'aggiornamento a Xcode 6.3 (beta 1) e Swift 1.2, tutte le mie app si bloccano misteriosamente nello nella versione solo. Funzionano bene, dopo aver aggiornato il mio codice per Swift 1.2, in build Debug. Il debugger non ha alcun senso di in cui si verificano gli arresti anomali di e non è chiaro il motivo. Alcuni degli incidenti sonoMysterious arresti anomali in Swift 1.2 - in Release build solo

malloc: *** errore per oggetto 0x7ff0c3824800: puntatore venire liberato non è stato allocato *** impostare un punto di interruzione in malloc_error_break di debug

Altri sono "selettore non riconosciuto", ma non hanno senso; gli oggetti a cui vengono inviati i selettori non sono nemmeno oggetti che sono a conoscenza dell'uso. Sembra che qualcosa sia andato storto con la gestione della memoria, così che un oggetto sia sostituito da un altro.

Cosa diavolo potrebbe causare questo? Con niente di utile nello stack delle chiamate (in modo che non sappia nemmeno dove si trova il crash nel mio codice) e nessuna variabile che compare nel pannello delle variabili del debugger quando passo il mio codice (in modo che non possa nemmeno guarda i valori delle cose), come potrei anche iniziare a rintracciarlo?

risposta

12

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.

+0

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

+1

questo capita anche a me, con una stringa. non ho ancora trovato una soluzione alternativa – alexdd55

+0

@ 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

Problemi correlati