Вопрос по xcode, build-settings, ios, assert, swift – Утверждения попадают в производственную сборку, вызывая сбои

5

У меня есть несколькоassert(condition, "message") Заявления в моем проекте.

Они используются для проверки инвариантных условийво время разработки, Я думал, что они будут игнорироваться в сборке производства / выпуска (как указано вэтот ответ).Они не. Вместо этого они вызывают сбои во время тестирования TestFlight. При комментировании утверждает, что приложение не падает. Что-то обычно получается немного не так, но это не дает сбоя.

Это может быть что-то с моими настройками сборки?

Все мои архивные схемы используют конфигурацию выпуска:

Утверждения находятся в проекте Cocoa Touch Framework, который используется из пользовательского расширения клавиатуры.

Все цели во всех проектах (Cocoa Touch Framework и основной проект с целью расширения клавиатуры) имеют следующие параметры сборки:

Enable Foundation Assertions
    Debug    YES
    Release  NO

Disable Safety Checks  NO

В чем дело?

РЕДАКТИРОВАТЬ:

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

По умолчанию это работает именно так - и так же работает в моем основном проекте. Но это не работает для утверждений, расположенных в проекте Framework, который связан с этим основным проектом (подробности вэтот вопрос). Зачем? Как это исправить?

Я также думаю, что это не должно быть обязательным (это требовалось в одной из первых бета-версий). Sulthan
Ты пробовал мойответ? Sulthan
@Sulthan Пожалуйста, смотрите мое редактирование - поведение сборщиков по умолчанию нарушено в Frameworks. Rasto
@ Sulthan Нет, я не сделал. Я подумал, что не нужно добавлять какие-либо пользовательские флаги, чтобы он игнорировал утверждения в релизе. Я попробую это сейчас. Rasto

Ваш Ответ

1   ответ
2

Enable Foundation Assertions находится в разделе предварительной обработки (макросы). Swift не подвергается предварительной обработке и не использует макросы. Эта опция отключаетNSAssert, NSParameterAssert и подобные макросы, обычно используемые в Objective-C.

Disable Safety Checks это вариант производительности:

По умолчанию стандартная библиотека гарантирует безопасность памяти. Многие функции и методы документируют требования, которые должны быть выполнены вызывающей стороной, такие как действительный индекс массива; безопасность памяти гарантируется, даже если требование нарушено. Однако нарушение требования может вызвать ошибку времени выполнения. API-интерфейсы, в названии которых содержится слово «unsafe», позволяют явно отключить проверки безопасности в тех местах, где вам нужна дополнительная производительность. Вы несете ответственность за проверку безопасности кода, который использует небезопасные API. Безопасность памяти также не гарантируется, если в многопоточном коде есть условие гонки.

(Swift Library Reference)

Вам, наверное, стоит попробовать мой ответВот (использование-assert-config Release вOther Swift Flags).

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

@drasto Вы должны поместить их в проект и цель, которая содержит утверждения. Это просто флаг компилятора. Sulthan
@drasto Вы должны положитьRelease там нетDebug. Sulthan
Где я могу поставить эти флаги? Какой проект, какая цель? Я знаю об ошибках там. Они редки, незначительны, и я планирую исправить их в будущих выпусках. Аварии, вызванные утверждениями, гораздо более серьезны. Rasto
Я хотел попробовать, если это имеет какое-то значение без необходимости архивировать, публиковать и загружать - отладка должна отключить assert во время отладки, верно? Rasto

Похожие вопросы