1

我有以下功能:

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这似乎证实了我正在取消分配的怀疑。

4

0 回答 0