我正在编写一个烧录到光盘的应用程序,从刻录进度面板返回时出现了一个奇怪的问题。
我像这样调用磁盘录制设置表:
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以来只是一个问题!
答案 0 :(得分:0)
事实证明这是一个保留问题。在调用obj-c类以启动用于刻录的设置窗口之后,disk_buckets中的元素都被过度释放。这是一个黑客,但我枚举了元素,并在调用设置面板之前将它们分配给一个新的数组。