我有以下功能:
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
是一个默认设置为零的整数。
代码应该起作用,所以当按下我的自定义键盘应用程序扩展上的删除键时,如果仍然循环,它将不会调用delete循环,从而防止了太多的方法调用。
代码似乎工作正常,但如果我快速点击删除按钮(因此反复调用此函数)很长一段时间,我会收到以下错误:
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
正在被解除分配。