Ich schreibe eine App, die auf optische Disks brennt, und es gibt ein seltsames Problem, wenn ich vom Brennvorgang-Panel zurückkomme.Array wird beim Brennen nicht mehr verfügbar API-Benachrichtigungskette
Ich nenne Plattenaufzeichnungs- Einstellblatt wie folgt aus:
let setup_panel = DRBurnSetupPanel()
let passed = UnsafeMutableRawPointer(Unmanaged.passUnretained(self.disk_buckets[current_burn_disk]).toOpaque())
setup_panel.beginSetupSheet(for: self.window, modalDelegate: self, didEnd: #selector(self.burnSetupPanelDidEnd(_:return_code:context_info:)), contextInfo: passed)
disk_buckets
ist eine Anordnung von Klassen jeweils einen Verweis auf eine DRTrack
enthält verbrannt werden - I ein Element übergeben, so dass ich mit dem DRTrack
umgehen kann Referenz später.
Nachdem der Setup-Panel entlassen wird, wird die folgende Methode dann genannt:
func burnSetupPanelDidEnd(_ panel: DRBurnSetupPanel, return_code: Int, context_info: UnsafeMutableRawPointer) {
//…. some code ….
var track:DRTrack = self.disk_buckets[self.current_burn_disk].vDRTrack!
NotificationCenter.default.addObserver(self, selector: #selector(self.progressDidEnd), name: NSNotification.Name(rawValue: BTVDiscBurnDidEndNotification), object: nil)
self.objc_panel.presentDiscProgressPanel(self.window, burner: panel.burnObject(), layout: track!)
}
objc_panel
ist ein obj-c singleton: zu initialisiert und stellt eine Disc brennen Fortschrittsanzeige (ich habe es auf diese Weise als tun in Swift ist fehlerhaft - das Fortschrittsfenster wird als kleines Fenster anstelle des Standard-Betriebssystems angezeigt - der Fehlerbericht wurde an Apple gesendet. Am Ende der Verbrennung objc_panel
Beiträge der BTVDiscBurnDidEndNotification
Benachrichtigung lassen die AppDelegate
wissen, dass es fertig ist und so zu nennen:
func progressDidEnd(_ note: Notification?) {
print (“DEBUG count: \(self.disk_buckets.count)")
print (“DEBUG first element: \(self.disk_buckets[0])")
//…. more code ….
}
Alle bis zum Ende der Kette gut geht, wenn jeder Versuch, das erste Element zuzugreifen (oder eine , was das betrifft) verursacht einen Absturz:
2016-10-04 14:01:34.654 DiskSpan[4025:220213] *** -[DiskSpan.BackupDisk retain]: message sent to deallocated instance 0x6000cafc0f40
(Backupdisk die Klasse zu sein, die das Array)
jedoch die erste Zeile dh 1. So eine korrekte Zählung des Arrays ausdruckt auffüllt, wie komme ich ca Zugriff auf nichts im Array während eines Benachrichtigungsposts?
EDIT: Ich versuchte append
ein Dummy-Element in das Array vor dem Lesen zurück und immer noch der Absturz tritt nur beim Versuch, das Array lesen - nicht zu schreiben.
Es sollte beachtet werden, dass dies unter Swift 2 funktionierte und erst seit Swift 3 ein Problem geworden ist!