EXC_BAD_ACCESS в основном только для iPad
Когда я тестирую свое приложение на своем iPad, я могу постоянно и надежно привести его к сбою. Когда это происходит, я получаю сообщение об ошибке EXC_BAD_ACCESS в main, и основная причина далеко не очевидна. Я попробовал следующие шаги, чтобы попытаться пролить больше света на это:
- Я включил зомби. Это, похоже, никак не повлияло на результаты, что заставляет меня думать, что это не проблема зомби (но, очевидно, я могу ошибаться).
- Я добавил точку останова исключения, но когда приложение падает, точка останова исключения не срабатывает, и все, что я получаю, это стандартная зеленая стрелка рядом со строкой 16 основной.
- Я запустил Анализатор и исправил несколько незначительных ошибок, которые были там обнаружены. Тем не менее, никакого эффекта.
- Я подтвердил, что такая же проблема возникает для двух моих тестеров, которые получают сборку через тестовый полет.
- Я выполнил "Чистую", а также "Чистую папку сборки"
Вот что особенно странно. Когда я тестирую на iPad, приложение постоянно падает. Когда я тестирую в симуляторе, он не падает, что бы я ни делал. Так что, если это зомби, я в недоумении, как выяснить, какой объект лучше сохранить. Кроме того, если я тестирую на своем iPhone, приложение также не падает.
Где происходит сбой: в приложении у меня есть несколько узлов спрайтов, которые отображают информацию, когда я касаюсь одного из них (на самом деле, я касаюсь дочернего спрайта, сделанного в виде кнопки отмены), что должно случается так, что я удаляю родителя кнопки отмены из его родителя с помощью:
[[self parent] removeFromParent];
Рис стека вызовов:
В главном окне xcode ничего нет в консоли, но это в консоли устройства (из окна органайзера:
Apr 10 08:50:39 Roberts-iPad com.apple.debugserver-310.2[596] <Warning>: 69 +0.000164 sec [0254/060b]: far -> 788
Apr 10 08:50:39 Roberts-iPad com.apple.debugserver-310.2[596] <Warning>: 70 +0.000079 sec [0254/060b]: esr -> 796
Apr 10 08:50:39 Roberts-iPad com.apple.debugserver-310.2[596] <Warning>: 71 +0.000081 sec [0254/060b]: exception -> 800
Apr 10 08:50:42 Roberts-iPad backboardd[31] <Error>: HID: The 'Passive' connection 'Bubble Fit' access to protected services is denied.
Apr 10 08:50:43 Roberts-iPad backboardd[31] <Warning>: CoreAnimation: updates deferred for too long
Apr 10 08:50:57 Roberts-iPad lockdownd[25] <Notice>: 01cdc000 _select_socket: receive secure message timeout!
Apr 10 08:50:57 Roberts-iPad lockdownd[25] <Notice>: 01cdc000 _receive_message: walk away - non-SSL 1
До вчерашнего дня я думал, что я очень, очень близок к отправке:PI был бы признателен за любой совет о том, как пролить больше света на причину этого исключения. Спасибо!
ОБНОВЛЕНИЕ: Как LearnCocos2D указывает ниже, у меня вполне может быть та же ошибка SpriteKit, на которую он ссылается. Предлагаем переопределить removeFromParent. Я попробовал это, но выдает ошибку:
- (void)removeFromParent
{
[self removeFromParent];
self = nil;
[super removeFromParent];
}
Ошибка, которую он выдает, состоит в том, что self не может быть назначено вне init. Как мне это переписать?
1 ответ
Как оказалось, это действительно была ошибка в SpriteKit, более подробно обсуждаемая здесь:
Сбой Sprite Kit iOS 7.1 при удалении из родительского
Мое исправление состояло в том, чтобы переопределить removeFromParent в подклассе SKShapeNode, который содержал дочерние элементы, которые должны были быть nil'ed перед удалением родителя, как показано ниже:
- (void)removeFromParent
{
[self.addButton removeFromParent];
[self.cancelButton removeFromParent];
self.addButton = nil;
self.cancelButton = nil;
[super removeFromParent];
}
Узлы дочерней формы являются свойствами родителя.