我有以下功能:
func delete()
{
if (deleteCounter == 0)
{
print("Deletion Start")
deleteCounter = 1
// Execute async delete task
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),
{
if (self.textDocumentProxy.isProxy())
{
for _ in 1..<50
{
(self.textDocumentProxy as UIKeyInput).deleteBackward()
}
}
print("Deletion End")
self.deleteCounter = 0
})
} else
{
print("Denying deletion")
}
}
其中deleteCounter
是一个默认设置为零的整数。
该代码应该起作用,因此当按下我的自定义键盘应用程序扩展上的删除键时,如果它仍在循环,它将不会调用删除循环,从而防止过多的方法调用。
代码似乎工作正常,但如果我在很长一段时间内快速点击删除按钮(从而重复调用此函数),我会收到以下错误:
Thread 3: EXC_BAD_ACCESS(code = 1,address=0x10)
在这条线上:
(self.textDocumentProxy as UIKeyInput).deleteBackward()
我从不修改该self.textDocumentProxy
对象,因为它只是 IOS 为您可以随时访问的键盘扩展提供的默认对象。
在阅读了EXC_BAD_ACCESS
错误之后,我发现这可能是因为该self.textDocumentProxy
对象在某个时候从内存中释放了。
如何防止self.textDocumentProxy
被释放,或者如何确保我始终可以获得对象的未发布副本?
更新:
我启用了僵尸对象,我收到以下错误消息:
[_UIInputViewControllerOutput setKeyboardOutputs:]: message sent to deallocated instance 0x146435b10
self.textDocumentProxy
这似乎证实了我正在取消分配的怀疑。