[ViewController жест Recognizer:shouldRecognizeSim одновременно ouslyWithGestureRecognizer:]: сообщение отправлено на освобожденный экземпляр
У меня простой сценарий.
Я толкаю myViewController
на стек навигации.
myViewController
в основном показывает представление коллекции на весь экран. Я добавил дополнительный UIPanGestureRecognizer
на этой коллекции посмотреть и установить myViewController
как его делегат. Я сохраняю сильную ссылку на это средство распознавания жестов панорамирования внутри myViewController
,
Когда я нажимаю Назад, myViewController
извлекается из стека навигации и освобождается. myViewController
"s dealloc
метод вызывается как следует. До этого момента все работает как положено.
Тогда я пытаюсь открыть то же самое myViewController
как в первый раз и сбой происходит с сообщением:
[MyViewController gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:]: message sent to deallocated instance
У меня этот метод реализован в myViewController
и всегда возвращается YES
, Но это даже не должно иметь значения, потому что никто не должен даже вызывать этот метод, потому что ни у кого не должно быть сильной ссылки на него. Очевидно, что кто-то все еще держит слабую ссылку, так как dealloc
метод был вызван на единственный экземпляр, который когда-либо существовал.
Даже не init
метод MyViewController
вызывается.
Я попытался поместить следующий код как в dealloc
И в viewWillDisappear
:
[self.myPanGestureRecognizer removeTarget:self action:@selector(panGestureAction:)];
[self.collectionView removeGestureRecognizer:self.myPanGestureRecognizer];
self.myPanGestureRecognizer.delegate = nil;
self.myPanGestureRecognizer = nil;
Но это ничего не изменило. Каждый раз одно и то же - myViewController получает initialized
и отображается нормально с первого раза. Во второй раз, когда я пытаюсь инициализировать и нажать, происходит исключение. Очевидно, что это связано с распознавателем жестов панорамирования, который я добавил, но я не понимаю, как это сделать.
1 ответ
Ответ на этот вопрос закончил тем, что исправил мою проблему, которая была очень похожа: gestRecognizer должен ReceiveTouch, сохраняющийся в освобожденном представлении, вызывающем сбой
Я неправильно устанавливал self.navigationController.interactivePopGestureRecognizer.delegate для себя.
Так что, хотя ошибка, сообщенная от NSZombie, была в другом классе. Его распознаватель жестов на самом деле не был виновником, это был мой interactivePopGestureRecognizer.