2016-04-02 2 views
5

У меня есть несколько assert(condition, "message") заявлений в моем проекте.Аптеки попадают в серийную сборку, вызывая сбои

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

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

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

enter image description here

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

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

Enable Foundation Assertions 
    Debug YES 
    Release NO 

Disable Safety Checks NO 

Что случилось?


EDIT:

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

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

+0

Вы попробовали мой [ответ] (http://stackoverflow.com/a/24038197/669586)? – Sulthan

+0

@ Султан Нет, я этого не делал. Я думал, что не нужно добавлять какие-либо пользовательские флаги, чтобы игнорировать утверждения в выпуске. Я попробую сейчас. – drasto

+0

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

ответ

2

варианты вы пробовали:

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

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

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

(Swift Library Reference)

Вы, вероятно, следует попробовать мой ответ here (используйте -assert-config ReleaseOther Swift Flags в).

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

+0

Где я могу поместить эти флаги? Какой проект, который нацелен? Я знаю об ошибках. Они редки, несовершенны, и я планирую исправить их в будущих выпусках. Сбои, вызванные утверждениями, гораздо более серьезны. – drasto

+0

@drasto Вы должны поместить их в проект и цель, содержащую утверждения. Это всего лишь флаг компилятора. – Sulthan

+0

Кажется, что это не сработало - я помещаю '-assert-config Debug' в проект, содержащий утверждения (это проект Framework, связанный с другим проектом), запускать его из XCode, но утверждения все равно попадают – drasto

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