Xcode ›= 9.1 больше не генерирует Этот класс не соответствует кодированию значения ключа для сообщений ключа xxx для взломанных выходов?

Если у вас есть раскадровка / XIB с IBOutlet, подключенным к соответствующему свойству IBOutlet в вашем коде, а затем вы удаляете выход в коде, вы раньше вылетали с довольно загадочным сообщением об ошибке о том, что «этот класс не является кодированием значения ключа -совместимый для ключа <outlet_name>"

Это не первое мое родео Xcode, поэтому я привык к этому сообщению. Я вижу это и думаю: «О, дерьмо, у меня либо неработающая ссылка на выход, либо пользовательский атрибут времени выполнения, который указывает на недопустимое имя ключа», и иду исправлять это.

Однако моя компания только что перешла на Xcode 9.1 (я знаю, что мы должны быть на 9.2, не говоря уже о 9.1, но у нас большая команда и огромная смешанная кодовая база Swift/Objective-C, и миграция нашей цепочки инструментов чревата сложностью). У меня только что была ошибка слияния, когда в раскадровке остался ныне несуществующий выход.

Когда я запустил приложение и выполнил путь кода, который должен отображать эту сцену в моей раскадровке, у меня произошел сбой в main.m, ничего в трассировке стека и никаких подсказок в консоли. Просто СПЛАТ.

Я потратил 2 часа на поиски этого щенка.

Сообщение об ошибке раньше было загадочным, как h**l, но, по крайней мере, оно дало вам подсказку. Теперь кажется, что вы просто падаете без объяснения причин.


person Duncan C    schedule 26.12.2017    source источник
comment
У вас случайно не было точки останова исключения, не так ли? Это может захватывать исключения до того, как они отобразят сообщение на консоли...   -  person Rob    schedule 26.12.2017
comment
Когда вы получили этот сбой в main.m, как именно он выглядел? Ошибка была выделена красным или зеленым цветом? Что именно было сказано в окне редактора, где произошла ошибка?   -  person Rob    schedule 26.12.2017
comment
Излишне говорить, что я вижу нормальное поведение в 9.2 (конечно, без точек останова). Я не возвращался и не тестировал в 9.1 (но могу, если вам это абсолютно необходимо). Но я был бы очень удивлен, если бы это было введено в 9.1 и вернулось к типичному поведению в 9.2. Интересно, есть ли что-то еще в вашем проекте...   -  person Rob    schedule 26.12.2017
comment
Нет, у меня не было никаких точек прерывания исключений, и это было бесполезное сообщение о нарушении прав доступа (у меня его больше нет передо мной. Цвет я тоже больше не помню).   -  person Duncan C    schedule 26.12.2017


Ответы (1)


Apple не удалила эту функцию в Xcode 9+, я тестировал как Xcode 9.1, так и Xcode 9.2.

Я думаю, что есть несколько способов воспроизвести эту проблему:

  1. Использование консольного фильтра может привести к исчезновению некоторых логов в этот момент. Чистый фильтр может их вернуть.
  2. Использование точки останова исключения, как говорит Роб в комментариях к вопросу. Продолжить выполнение или отключить точку останова, появится ошибка неперехваченного исключения.

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

person Looping    schedule 27.12.2017