EXC_BAD_ACCESS при использовании dispatch_async. Как предотвратить высвобождение объекта?

У меня есть следующая функция:

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 распределяется.

0 ответов

Другие вопросы по тегам