2014-11-07 11 views
13

Ho un oggetto accessibile tramite una var statica in una struttura (soluzione per la mancanza di classe di supporto variabile nella rapida in questo momento), strutturata in questo modo:EXC_BAD_ACCESS su iOS 8.1 con dizionario

struct Constants{ 
    static var myObj = MyObject() 
} 

MyObject ha un dizionario in questo modo:

class MyObject{ 
    private var params = Dictionary<String,AnyObject>() 

    func addParam(key:String, value:AnyObject){ 
     params[key] = value 
    } 
} 

Ora alla prima chiamata a questo oggetto per Contants.myObj.addParam("param", value:123) tutto va bene e params ha contenuti ["param":123]. Alla seconda chiamata per Contants.myObj.addParam("param", value:456), ottengo un EXC_BAD_ACCESS.

Ecco il kicker, questo si verifica solo in iOS 8.1. Inoltre, se aggiungo la riga let stupidHack = self.params come prima riga del mio metodo addParam, funziona correttamente. La mia ipotesi è che si tratti di mutabilità dei dizionari. Il let può in qualche modo innescare il dizionario per essere mutevole di nuovo dopo l'inizializzazione.

Qualcun altro si è già imbattuto in questo problema? Qualche idea su come risolverlo?

Grazie!

+0

Ho riscontrato lo stesso problema con un'app Mac che sto creando. Il mio si è schiantato alla terza volta, non importa cosa sia successo. Sei lasciato che il metodo stupidHack abbia funzionato per me. Così bizzarro, ma grazie! –

risposta

5

Sembra un errore del compilatore.

Hai provato a passare tra Release e Debug e poi a ricostruire? Se il debug funziona ma non viene rilasciato, può essere un'indicazione di un bug del compilatore/ottimizzatore.

Accade anche nel simulatore?

Il codice funziona per me su iOS 8.1 con XCode 6.1.

+0

Funziona correttamente nel simulatore, ma non su un dispositivo fisico (IPhone 6). – steventnorris

+0

Questo problema si verifica solo in modalità di rilascio, molto strano – Zipme

+0

Questo sembra essere una sorta di bug. Tuttavia, il trucco che ho postato sopra risolve il problema. La mia ipotesi è che si tratti di mutabilità dei dizionari. Il let può in qualche modo innescare il dizionario per essere mutevole di nuovo dopo l'inizializzazione. – steventnorris

1

Per caso, hai un iPhone 6 con 64 Gb? Ne ho uno e ho avuto lo stesso problema usando i dizionari due volte.

Nelle notizie (beh le notizie tecnologiche ...), ho letto che i moduli di memoria difettosi forniti da Toshiba proprio per questo modello di iPhone potrebbero causare allocazioni errate in memoria.

0

Affrontare problemi simili con il codice swift e risolvere tali problemi disabilitando l'ottimizzazione del compilatore rapido nelle impostazioni di costruzione della destinazione dell'applicazione.

0

Provare a regolare il livello di ottimizzazione del compilatore Swift su "Nessuno" (Impostazioni di creazione).

Ho avuto un problema simile con una classe che è stata deallocata senza alcuna ragione apparente, è principalmente un bug del compilatore come ha detto Lee.

Problemi correlati