2014-11-07 7 views
13

Ich habe ein Objekt, erreichbar über eine statische var in einer Struktur (Abhilfe für den Mangel an Klassenvariable Unterstützung in swift jetzt), wie folgt strukturiert:EXC_BAD_ACCESS auf iOS 8.1 mit Wörterbuch

struct Constants{ 
    static var myObj = MyObject() 
} 

MyObject hat eine Wörterbuch in ihm etwa so:

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

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

nun auf dem ersten Aufruf dieses Objekt für Contants.myObj.addParam("param", value:123) alles ist gut und params hat Inhalt ["param":123]. Beim zweiten Anruf für Contants.myObj.addParam("param", value:456) bekomme ich eine EXC_BAD_ACCESS.

Hier ist der Kicker, dies tritt jedoch nur in iOS 8.1. Auch, wenn ich die Zeile let stupidHack = self.params als erste Zeile meiner addParam Methode hinzufügen, funktioniert es gut. Meine Annahme ist, dass es sich um die Veränderlichkeit von Wörterbüchern handelt. Das let kann das Wörterbuch nach der Initialisierung möglicherweise wieder veränderbar machen.

Hat jemand anderes dieses Problem schon einmal erfahren? Irgendeine Idee, wie man es repariert?

Danke!

+0

Ich hatte das gleiche Problem mit einer Mac-App, die ich erstelle. Meine ist beim dritten Mal abgestürzt, egal was passiert ist. Du hast die stupidHack-Methode für mich arbeiten lassen. So bizarr, aber danke! –

Antwort

5

Sieht aus wie ein Compiler-Fehler.

Haben Sie versucht, zwischen Release und Debug zu wechseln und dann neu zu erstellen? Wenn Debug funktioniert, aber nicht freigegeben wird, kann dies ein Hinweis auf einen Compiler-/Optimierungsfehler sein.

Kommt es auch im Simulator vor?

Ihr Code funktioniert für mich auf iOS 8.1 mit XCode 6.1.

+0

Es funktioniert gut im Simulator, aber nicht auf einem physischen Gerät (IPhone 6). – steventnorris

+0

Dieses Problem tritt nur im Freigabemodus auf, sehr seltsam – Zipme

+0

Dies scheint eine Art Bug zu sein. Der oben beschriebene Let Hack behebt jedoch das Problem. Meine Annahme ist, dass es sich um die Veränderlichkeit von Wörterbüchern handelt. Das let kann das Wörterbuch nach der Initialisierung möglicherweise wieder veränderbar machen. – steventnorris

1

Haben Sie zufällig ein iPhone 6 mit 64 GB? Ich habe einen und ich hatte das gleiche Problem mit Wörterbüchern zweimal.

In den Nachrichten (naja, die Tech News ...), las ich, dass die defekten Speichermodule, die von Toshiba für genau dieses iPhone-Modell geliefert wurden, falsche Zuordnungen im Speicher verursachen konnten.

0

Konfrontiert ähnliche Art von Problemen mit Swift-Code und behoben solche Probleme durch Deaktivieren der schnellen Compiler-Optimierung in den Build-Einstellungen des Anwendungsziels.

0

Versuchen Sie, die Swift-Compiler-Optimierungsebene auf "Keine" (Build-Einstellungen) zu setzen.

Ich hatte ein ähnliches Problem mit einer Klasse, die aus keinem ersichtlichen Grund freigegeben wurde, es ist meistens ein Compiler-Fehler wie Lee sagte.

Verwandte Themen