2016-04-02 21 views
5

Ho diverse istruzioni assert(condition, "message") nel mio progetto.Gli assalti vengono colpiti in build di produzione causando arresti anomali

Sono utilizzati per verificare le condizioni invarianti durante lo sviluppo. Ho pensato che sarebbero stati ignorati nella produzione/versione di rilascio (come indicato in this answer). Non lo sono. Invece causano arresti anomali durante il test di TestFlight. Quando commento afferma che l'app non si blocca. Di solito qualcosa va storto, ma non si blocca.

Può essere qualcosa con le mie impostazioni di compilazione?

Tutti i miei schemi di archiviazione utilizzano configurazione di rilascio:

enter image description here

Il asserisce sono in progetto Cocoa Touch Framework, che viene utilizzato da estensione tastiera personalizzata.

Tutti gli obiettivi in ​​tutti i progetti (Cocoa Touch Framework, e il progetto principale con l'obiettivo di estensione della tastiera) hanno queste le impostazioni di creazione:

Enable Foundation Assertions 
    Debug YES 
    Release NO 

Disable Safety Checks NO 

Cosa c'è di sbagliato?


EDIT:

Sulthan's answer mostra come disattivare afferma globalmente sia per debug e relase costruisce. Non è quello di cui ho bisogno. Voglio che funzioni come previsto: gli avvisi dovrebbero essere abilitati nel debug ma disabilitati nelle versioni di rilascio.

Per impostazione predefinita funziona in questo modo - e funziona anche in questo modo nel mio progetto principale. Ma non funziona per le affermazioni situate nel progetto Framework che è collegato da quel progetto principale (dettagli in this question). Perché? Come sistemarlo?

+0

Hai provato la mia [risposta] (http://stackoverflow.com/a/24038197/669586)? – Sulthan

+0

@Sulthan No non l'ho fatto. Ho pensato che non fosse necessario aggiungere alcun flag personalizzato per assicurarsi che ignori gli asserzioni durante il rilascio. Lo proverò ora. – drasto

+0

Penso anche che non dovrebbe essere richiesto (era richiesto in una delle prime versioni beta). – Sulthan

risposta

2

Le opzioni che hanno provato:

Enable Foundation Assertions è nella sezione di pre-elaborazione (Macro). Swift non è pre-elaborato e non utilizza macro. Questa opzione disabilita NSAssert, NSParameterAssert e macro simili comunemente utilizzate in Objective-C.

Disable Safety Checks è un'opzione prestazioni:

Per impostazione predefinita, la libreria standard garantisce la sicurezza di memoria. Molte funzioni e metodi documentano i requisiti che devono essere soddisfatti dal chiamante, come un indice array valido; la sicurezza della memoria è garantita anche se un requisito viene violato. Tuttavia, la violazione di un requisito può causare un errore di runtime. Le API che includono la parola "non sicuro" nel loro nome consentono di disattivare esplicitamente i controlli di sicurezza nei luoghi in cui è necessario il rendimento aggiuntivo. È tua responsabilità verificare la sicurezza della memoria del codice che utilizza API non sicure. Anche la sicurezza della memoria non è garantita se c'è una condizione di competizione nel codice multithread.

(Swift Library Reference)

Probabilmente si dovrebbe provare la mia risposta here (utilizzare -assert-config Release in Other Swift Flags).

O semplicemente mantenere le asserzioni nei build di produzione. Ogni affermazione fallita è un bug e in generale è meglio conoscere un bug il prima possibile.

+0

Dove inserisco queste bandiere? Quale progetto, quale target? Conosco i bug lì. Sono rari, minori e ho intenzione di risolverli nelle versioni future. I crash causati dagli assert sono molto più gravi. – drasto

+0

@drasto Devi metterli nel progetto e nella destinazione che contiene gli asser. È solo una bandiera del compilatore. – Sulthan

+0

Non sembra funzionare - ho messo '-assert-config Debug' su progetto contenente asserti (questo è un progetto Framework collegato da un altro progetto), eseguilo da XCode ma gli asseriti sono ancora colpiti – drasto