使用dispatch_async时EXC_BAD_ACCESS。如何防止对象被释放?

时间:2016-09-02 02:37:33

标签: ios swift grand-central-dispatch exc-bad-access textdocumentproxy

我有以下功能:

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正在被解除分配。

0 个答案:

没有答案