Как отлаживать EXC_BAD_ACCESS code=2 при использовании ARC

Я вижу здесь много потоков о том, как решить код EXC_BAD_ACCESS = 2, и, похоже, консенсус заключается в том, что я пытаюсь получить доступ к моему массиву или объекту в моем массиве после того, как я его уже выпустил. Я вижу, что в большинстве случаев решения кажутся тем, что в их коде слишком много [выпуска объекта]. Проблема для меня в том, что у меня нет релизов, потому что я использую ARC.

Итак, мой вопрос в том, как мне самому заняться отладкой с этого момента. Я могу опубликовать код, если это поможет, но я думаю, что в качестве первого шага мне просто нужна помощь в том, каким должен быть мой следующий шаг и как это сделать.

Я обнаружил, что во многих потоках говорится, что я должен включить NSZombiesEnabled, чтобы помочь найти источник проблемы.

До того, как Zombies были включены, мое приложение собиралось и запускалось абсолютно без ошибок или предупреждений. Но как только вы нажмете кнопку в симуляторе, он вылетит.

После включения зомби приложение по-прежнему строится и работает без ошибок, но теперь оно вылетает, как только появляется симулятор, и теперь XCode теперь переключается на навигатор отладки в разделе 1, в нем перечислены более 100 000 записей, и каждая из них, которую вы нажимаете on показывает некоторые вещи в главном окне, что я не знаю, что означает.

Итак, что мне теперь делать? Я включил Зомби и снова побежал, я вижу кучу вещей на экране, но действительно не знаю, как это понять. Я попытался опубликовать снимок экрана, но у меня пока нет на это полномочий.


person jonathan3087    schedule 16.02.2013    source источник
comment
Нам нужен код, чтобы помочь. Не забудьте включить код вокруг строки EXC_BAD_ACCESS. С ARC многие ошибки, связанные с памятью, автоматически устраняются ARC, поскольку он выделяет и освобождает и гарантирует, что не будет чрезмерного освобождения. Сказав это, в зависимости от логики кода это может произойти. Поэтому, пожалуйста, опубликуйте код.   -  person Khaled Barazi    schedule 17.02.2013


Ответы (1)


Я просмотрел ваш исходный код и нашел проблему. Вы пытаетесь установить свойство numberOfMatchingCards для self.game, пока вы лениво загружаете game, создавая бесконечный цикл. Ваш self.game.numberOfMatchingCards попытается загрузить новую игру, так как вы еще не закончили создание экземпляра игры к моменту вызова вашего сеттера. Просто измените

- (IBAction)cardModeChanged:(UISegmentedControl *)sender {
    switch ([sender selectedSegmentIndex]) {
        case 0:
            self.game.numberOfMatchingCards = 2;
            break;
        case 1:
            self.game.numberOfMatchingCards = 3;
            break;
        default:
            self.game.numberOfMatchingCards = 2;
            break;
    }
}

to

- (IBAction)cardModeChanged:(UISegmentedControl *)sender {
    switch ([sender selectedSegmentIndex]) {
        case 0:
            _game.numberOfMatchingCards = 2;
            break;
        case 1:
            _game.numberOfMatchingCards = 3;
            break;
        default:
            _game.numberOfMatchingCards = 2;
            break;
    }
}

Я не уверен, что это решит вашу проблему с плохим доступом, но это причина многих записей в навигаторе отладки. Дайте мне знать, если у вас все еще есть проблема с плохим доступом после исправления этого. Важно помнить, что даже если вы используете ARC, объекты все равно освобождаются (когда счетчик их ссылок падает до нуля).

person enjayem    schedule 17.02.2013
comment
Это действительно решило проблему, я больше не получаю бесконечный цикл, который вызывал множество записей в навигаторе отладки, как вы сказали. Я также решил проблему EXC_BAD_ACCESS. Итак, теперь я получаю чистую сборку и работаю с предупреждениями и без ошибок. Спасибо за ваше время в просмотре на это, я дергал себя за волосы. - person jonathan3087; 18.02.2013
comment
Спасибо за примечание о том, что нужно делать во время ленивой загрузки. Это все еще исправило это спустя 5 лет ???? - person LinusGeffarth; 05.12.2018