2016-10-04 1 views
0

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!

Antwort

0

Es stellt sich heraus, dass es sich um ein Aufbewahrungsproblem handelt. Nach dem Aufruf der obj-c-Klasse, das Setup-Fenster zum Brennen zu starten, werden die Elemente in disk_buckets vollständig freigegeben. Es war ein Hack, aber ich habe die Elemente aufgelistet und sie einem neuen Array zugewiesen, kurz bevor ich das Setup-Panel aufgerufen habe.