我有一个多线程的奇怪问题。我想打印一个表视图,因此启动一个使用进度条运行的新线程。最终这个线程死于内存错误,我正在寻找原因。现在我得到了
malloc: *对象0x10000078c的错误:无效的签名 指针从自由列表中出列 在malloc_error_break中设置断点以调试对象的CaLister(27054,0x7fff73ea3300)malloc: 错误 0x60800043bcc0:无效指针从空闲列表中出列 * 在malloc_error_break中设置断点以进行调试
但是大部分时间(仍然很少发生!)它只是停止而没有特定的(但肯定是与内存相关的)错误。当我从调试器查看时,我的数据是nil
。但是他们没有被触及,因为他们仍然可以在我的桌面视图中显示。
现在的问题是:我是否需要采取任何预防措施来访问主线程中分配的数据,以便我可以安全地从分离的线程中访问它们?
修改 我的打印线程就像这样(剥离代码):
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { self.performPrint (true) }
func performPrint (async:Bool) {
//First get the shared print info object so we know page sizes. The shared print info object acts like a global variable.
let sharedPrintInfo = NSPrintInfo.sharedPrintInfo()
let printObject = PSPrint ()
//Allocate a new instance of NSView into the variable printPageView
var frame = NSRect(x: 0, y: 0, width: sharedPrintInfo.paperSize.width-sharedPrintInfo.leftMargin-sharedPrintInfo.rightMargin, height: sharedPrintInfo.paperSize.height-sharedPrintInfo.topMargin-sharedPrintInfo.bottomMargin)
let basePrintPageView = PSPrintView(frame: frame)
var printPageView:PSPrintView
for pageNo in 1...paperDimensions.pages {
paperDimensions.pageNo = pageNo
printPageView = basePrintPageView.clone(pageNo)
//Set the option for the printView for what it should draw.
paperDimensions.pageNo = pageNo
//Finally append the view to the PSPrint Object.
printObject.printViews.append(printPageView)
}
dispatch_async(dispatch_get_main_queue()) {
printObject.printTheViews() //print all the views, each view being a 'page'.
}
}
在
printPageView = basePrintPageView.clone(pageNo)
访问我的表格视图(我获取要打印的数据)有时会返回nil。
Edit2:我刚注意到它不是崩溃的后台线程,而是主线程: - /更多地抓我的脑袋,但我可能不得不关闭这个问题。