在刻录API通知链中,阵列变得不可访问

时间:2016-10-04 15:02:34

标签: cocoa swift3

我正在编写一个烧录到光盘的应用程序,从刻录进度面板返回时出现了一个奇怪的问题。

我像这样调用磁盘录制设置表:

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是一个类数组,每个类都包含对要烧掉的DRTrack的引用 - 我传递一个元素,以便稍后处理DRTrack引用。

解除设置面板后,将调用以下方法:

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是一个obj-c单例,它初始化并呈现一个光盘刻录进度面板(我这样做是因为在Swift中这样做是错误的 - 进度面板显示为一个小窗口而不是默认窗口操作系统一 - 错误报告已发送给Apple)。在刻录objc_panel结束时发布BTVDiscBurnDidEndNotification通知,让AppDelegate知道它已完成,然后致电:

func progressDidEnd(_ note: Notification?) {
        print (“DEBUG count: \(self.disk_buckets.count)")
        print (“DEBUG first element: \(self.disk_buckets[0])")
//…. more code ….
}

一切顺利,直到链的末端,任何试图访问第一个元素(或任何,因此)导致崩溃:

2016-10-04 14:01:34.654 DiskSpan[4025:220213] *** -[DiskSpan.BackupDisk retain]: message sent to deallocated instance 0x6000cafc0f40

(BackupDisk是填充数组的类)

然而,第一行打印出正确的数组计数,即1.那么为什么在通知发布期间我无法访问数组中的任何内容?

编辑:我在读取数据之前尝试append一个虚拟项目,然后只有在尝试读取数组时才会发生崩溃 - 而不是写入数据。

应该注意的是,这在Swift 2下工作,自Swift 3以来只是一个问题!

1 个答案:

答案 0 :(得分:0)

事实证明这是一个保留问题。在调用obj-c类以启动用于刻录的设置窗口之后,disk_buckets中的元素都被过度释放。这是一个黑客,但我枚举了元素,并在调用设置面板之前将它们分配给一个新的数组。