iOS: несуществующий указатель вызывает сбой приложения

Когда я открываю определенную сцену раскадровки, мое приложение вылетает с ошибкой: "неверная контрольная сумма для освобожденного объекта - объект, вероятно, был изменен после освобождения". У меня также происходят некоторые сбои «EXC_BAD_ACCESS», обычно это одно или другое. Я не смог найти проблемный указатель, поэтому проверил его с помощью NSZombieEnabled. Это привело меня к следующему сообщению о сбое: *** -[NSContentSizeLayoutConstraint secondItem]: message sent to deallocated instance 0x1e0a5220

Теперь я искал в проекте [NSContentSizeLayoutConstraint secondItem] и даже только NSContentSizeLayoutConstraint и secondItem по отдельности. Его нет нигде в проекте. Я все еще очень новичок в Objective-C и понятия не имею, что делать дальше. Кроме того, он будет нормально работать примерно в 1 из 5 раз на устройстве и симуляторе. Это также произошло с: -[NSAttributeDictionary release]:, которого также нет в моем проекте. Кроме того, *** -[PitchDetector addSamples:inNumberFrames:]:. Они постоянно меняются, и я не могу найти их нигде в своем проекте. И иногда он работает нормально, обычно на симуляторе, что очень расстраивает, поскольку ошибка постоянно меняется на устройстве, когда оно выходит из строя.

Чтобы переключать представления в раскадровке, я использую этот код. Это в viewDidLoad на главном экране: x1ViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"x1ViewController"];

И когда кнопка нажата, чтобы загрузить его: - (IBAction)button4:(id)sender { [self presentViewController:x1ViewController animated:YES completion:nil]; }

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

Вот трассировка стека: введите здесь описание изображения

И вот странная вещь, которую я обнаружил во время анализа, которую я не знаю, как исправить: введите описание изображения здесь

Обновление: я также иногда получаю сообщение "Ошибка: 1768843636" в консоли после загрузки страницы. Очень странный.


person Henry F    schedule 31.01.2014    source источник
comment
покажите код, как вы выполняете переход или нажатие   -  person santhu    schedule 31.01.2014
comment
@santhu Только что обновился, спасибо.   -  person Henry F    schedule 31.01.2014
comment
Используете ли вы файл раскадровки, как вы подразумеваете в своей первой строке, или создаете все контроллеры представления самостоятельно?   -  person dpassage    schedule 31.01.2014
comment
@dpassage Я использую файл раскадровки.   -  person Henry F    schedule 31.01.2014
comment
Я не думаю, что это имеет какое-либо отношение к раскадровке.   -  person Henry F    schedule 31.01.2014
comment
Найдите в своем проекте NSLayoutConstraint (а не только NSContentSizeLayoutConstraint). Запустите статический анализатор через пункт меню Продукт › Анализ и исследуйте/исправьте то, что он сообщает. И можете ли вы включить обратную трассировку исключения выше?   -  person bneely    schedule 31.01.2014
comment
Покажите нам трассировку стека. Apple shift 4 позволит вам сделать скриншот области экрана. Добро пожаловать на просмотры!   -  person Stephen J    schedule 31.01.2014
comment
@StephenJ Конечно! Просто добавил его.   -  person Henry F    schedule 31.01.2014
comment
@bneely Спасибо, я нашел что-то сомнительное, но не знаю, как это исправить, я включил это в OP. Это может быть причиной.   -  person Henry F    schedule 31.01.2014
comment
Основываясь на обратной трассировке, я бы посмотрел в ваших xibs и раскадровках на предмет разорванных соединений или предупреждений автомакета. Описание исключения относится к коду Apple, и ваш код не находится в обратной трассировке, поэтому я думаю, что у вас либо ошибка конфигурации пользовательского интерфейса, либо ошибка Apple. Исключите первое, прежде чем принять второе. Что касается проблемы AudioBufferList, вы используете там два разных типа — приведение к AudioBufferList * при вызове sizeof(AudioBuffer). Не связано с исключением ограничения, но вы должны это исправить.   -  person bneely    schedule 31.01.2014
comment
@bneely Спасибо. Сейчас я дважды проверю все свои соединения и посмотрю, не сломано ли что-нибудь. Хотя я ничего не менял в раскадровке с тех пор, как она начала ломаться... странно. Я возился с одной меткой, которую создал с помощью кода, надеюсь, проблема в этом. Проверка сейчас.   -  person Henry F    schedule 31.01.2014


Ответы (1)


Чтобы переключать представления в раскадровке, я использую этот код. Это в viewDidLoad на главном экране:

x1ViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] 
                        instantiateViewControllerWithIdentifier:@"x1ViewController"];

Ну, это твоя проблема. viewDidLoad слишком рано. Вы еще даже не в интерфейсе, а уже пытаетесь перейти в следующее состояние интерфейса. Более того, вы рискуете попытаться представить один и тот же экземпляр контроллера представления в разных случаях.

Переместите этот код в свой код нажатия кнопки. Вам не нужно создавать экземпляр этого контроллера представления, пока не наступит момент, когда вы его представите. Используйте новый экземпляр контроллера представления каждый раз, когда вы представляете.

person matt    schedule 31.01.2014
comment
Я не перехожу к экрану x1, пока не нажму кнопку, это все еще проблема? - person Henry F; 31.01.2014
comment
Да, я только что это заметил. :( - person matt; 31.01.2014
comment
Конечно, спасибо, но я буду иметь это в виду, когда буду продолжать строить! - person Henry F; 31.01.2014
comment
Хорошо, попробуйте так: не создавайте экземпляр x1ViewController, пока не будет нажата кнопка. Юмор меня и посмотреть, если это поможет. Если нет, я просто удалю этот ответ, и мы попробуем еще раз. :) - person matt; 31.01.2014
comment
Очень странно создавать экземпляр контроллера представления задолго до того, как он вам понадобится, или создавать экземпляр контроллера представления до того, как текущий контроллер представления завершит настройку. Итак, давайте просто сделаем все как обычно и посмотрим, исправит ли это что-нибудь. - person matt; 31.01.2014
comment
Бьюсь об заклад, я положил на это палец (см. исправленный ответ выше). Вы не должны сохранять один и тот же экземпляр контроллера представления для нескольких презентаций. Создание экземпляра контроллера представления ничего не стоит, поэтому просто сделайте это совершенно обычным способом. - person matt; 31.01.2014
comment
Я внес изменения и, к сожалению, это не помогло. Я думаю, что у меня могут быть проблемы с глобальной переменной, которую я, возможно, испортил с реализацией. Может ли это быть причиной? - person Henry F; 31.01.2014
comment
Проблема заключается в том, что у вас есть ограничение (разработанное в раскадровке) на что-то в интерфейсе, которое исчезло. Вопрос в том, почему. - person matt; 31.01.2014
comment
На самом деле я только что сузил проблему, я обновил свой ОП внизу. - person Henry F; 31.01.2014
comment
Похоже, что это другая проблема (вы должны любить анализатор), но, возможно, вы вызываете повреждение памяти, которое позже непредсказуемым образом кусает вас. В любом случае, исправьте это и посмотрите, поможет ли это! - person matt; 01.02.2014
comment
Я думаю, вы правы, просто странное повреждение памяти, которое я не могу сузить - person Henry F; 01.02.2014
comment
Ну, ты починил то, что нашел Анализатор? - person matt; 01.02.2014
comment
Я на самом деле только что все исправил, ваш ответ привел меня на правильный путь. Я инициализировал слишком много вещей в viewDidLoad проблемного контроллера представления! - person Henry F; 01.02.2014
comment
Я понятия не имею, в чем была настоящая проблема, но я рад, что смог как-то помочь! - person matt; 01.02.2014