2017-06-11 6 views
0

Wie gesagt, bekomme ich einen Fehler, wenn ich eine Variable deklariere. Ich kann weder bei Google noch bei Swift-Dokumenten eine Lösung finden. Heres der Code:EXC_BAD_ACCESS beim Deklarieren einer Variablen

class Database { 
static let si = Database() // when removed it also resolves into an error 

init() { 
    print("Hello") // isn't printed. 
    self.setONs() // see code below to see where collected gets a new value 
    print("current device id: \(UIDevice.current.identifierForVendor!.uuidString)") // resolves into an error when declared as uuid which is now "TestUID" 
} 

var uuid: String = "TestUID" // its actual the device id. 
var gkid: String = "" // GKPlayerID 
var collected: [String : [String : Int]] = [:] // <- Thread 1: EXC_BAD_ACCESS(code=2,address=0x7fff59de4f8) 
private var collectedProgress: [String : [String : Int]] = [:] 

Wenn ich collectedProgress der schlechte Zugang erfolgt auf collectedProgress entfernen. Beide Variablen werden nur deklariert und nicht geschrieben oder gelesen. Selbst wenn ich die collectedProgress-Variable ebenfalls lösche, tritt bei der nächsten Variablen derselbe Fehler auf.

+0

ich nicht reproduzieren kann - könnten Sie bitte das Problem auf eine [MCVE] versuchen und zu kochen? (und sagen Sie, welche Version von Swift Sie laufen) – Hamish

+0

Ich versuche, es auf ein Minimum zu reduzieren. https://github.com/Aritmetic/Primal dies das ganze Projekt noch. Sie müssen den Server nicht einrichten, da der Fehler Sie stoppt, bevor er etwas tun kann. – Aritmetic

Antwort

0

ich das Problem gelöst. Ich bin nicht 100% sicher, wenn das der Fehler war, aber für jetzt theres kein EXC_BAD_ACCESS. Ich habe eine sharedInstance in Database() hinzugefügt und Database() in anderen Klassen/Objekten durch Database.sharedInstance ersetzt. Jetzt verwenden alle Objekte dasselbe Objekt. Der Empfänger in der Datenbank (SocketIOManager.sharedInstance.on ("") {}) könnte das Problem sein. Da sie neue Werte für die Variablen und einige mehr erhalten, aber da sie kommentiert wurden, trat der Fehler auch auf. Ich hoffe, dass Sie nicht den gleichen Fehler/Fehler bekommen, den ich mit Ihrem Code hatte.

Vielen Dank auch für Ihre Hilfe.

Fixed code on Github

0

Ihre zwei Variablen gesammelt und gesammeltProgress sind nicht richtig eingerichtet. Sie haben collected als ein Wörterbuch mit einem String-Schlüssel und einem Wert von [String:Int] deklariert, aber Sie versuchen, es mit einem Wörterbuch des Typs [Any:Any] zu initialisieren. Ich bin mir nicht sicher, warum das überhaupt kompiliert.

Versuchen Sie, Ihren Code zu diesem Wechsel:

var collected = [String : [String : Int]]() 
private var collectedProgress = [String : [String : Int]]() 

Mit diesem Code Anfangswerte für diese Variablen erstellen und lassen Sie die Compiler Abbildung automatisch ihre Art Datentypen aus.

Sie können auch einen typealias für Ihre [String : [String : Int] Typ erstellen möchten:

typealias DictOfDicts = [String : [String : Int]] 

//... 

var collected = DictOfDicts() 
private var collectedProgress = DictOfDicts() 
+0

'[:]' ist * nicht * ein '[Beliebige: Beliebige]' - es ist ein Dictionary-Literal, und kann als '[String: [String: Int]]' gut abgeleitet werden, OP-Code ist völlig legal . – Hamish

+0

Danke, dass Sie mich über die Art von '[:]' berichtigt haben. Tatsache ist jedoch, dass der OP-Code abstürzt und mit meinen Änderungen nicht mehr abstürzt. –

+0

Sehr seltsam. Als ich den OPs-Code zum ersten Mal auf einen Spielplatz kopiert habe, habe ich den gleichen Fehler, aber jetzt habe ich ihn wieder eingefügt und er stürzt nicht mehr ab. –

Verwandte Themen