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