2016-10-25 8 views
0

Приложение, в котором я работаю, имеет столько визуальных форматированных ограничений. После того, как я сгруппировал сетевой запрос в одну операцию, я начал получать сбой EXC_BAD_ACCESS. Я не получаю никакого сбоя, если вручную создаю ограничения с помощью инициализатора NSLayoutConstraint (item ....).NSLayoutConstraint VFL падает из-за EXC_BAD_ACCESS

Вот строка, где авария происходит в моем коде:

enter image description here

А вот журнал аварии: enter image description here

Что может вызвать этот сбой? и как я могу это исправить?

+0

Это в основном выглядит прекрасно (см. Ниже приведенную ниже ссылку). Меня устраивает. Где вы называете это 'addConstraints'? Очевидно, что это должно быть в подклассе 'UIView', но где именно вы это делаете? В нижней строке нам понадобится [MCVE] (http://stackoverflow.com/help/mcve). Я не могу воспроизвести проблему на основе того, что вы здесь указали. – Rob

+0

Несвязанные, как правило, вы бы сказали 'options: []'. 'NSLayoutFormatOptions' является' OptionSet', а пустой набор - '[]'. Фактически, с помощью метода 'constraints' этот параметр' options' является необязательным, по умолчанию используется '[]', поэтому вы можете даже опустить 'options: []' вообще. – Rob

ответ

0

У меня была такая же проблема при создании массива NSLayoutConstraints, после чего все сразу включались из массива.

Когда вы переходите в сторону от просмотра, возвращайтесь к нему, иногда представление может быть назначено на другое распределение памяти и вызывает ошибку «Плохой доступ».

Вот что происходит. Новые ограничения добавляются в массив каждый раз при загрузке представления (при условии, что вы добавляете их и активируете их из функции .viewDidLoad() или из аналогичной функции, которая загружается каждый раз, когда вид становится видимым снова).

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

Чтобы исправить это, позвоните .RemoveAll() в свой массив, прежде чем добавлять к нему новые ограничения. Это позволит удалить все старые ограничения и система не будет пытаться их активировать.

Вот пример.

var initialConstraints = [NSLayoutConstraint]() 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    // Empty the array once the view loads 
    initialConstraints.removeAll() 

    // Add your constraints like normal 
    initialConstraints.append(...) 

    // Activate your constraints once you've added them to the array (like normal) 
    NSLayoutConstraint.activate(initialConstraints) 

} 

Надеюсь, это поможет!

+0

Как просматривать нагрузку несколько раз? –

+0

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

+0

Но перемещение между вкладками не должно запускать viewDidLoad, если вы не вызываете их специально –

 Смежные вопросы

  • Нет связанных вопросов^_^