assert
è per controlli di integrità durante le prove, mentre precondition
è per la guardia contro le cose che, se capita, significherebbe il vostro programma proprio non poteva ragionevolmente procedere.
Quindi, ad esempio, è possibile inserire un assert
su alcuni calcoli con risultati sensibili (entro certi limiti, ad esempio), per trovare rapidamente se si è verificato un errore. Ma non vorresti spedire con questo, dal momento che il risultato fuori limite potrebbe essere valido, e non critico, quindi non dovrebbe mandare in crash la tua app (supponiamo che lo stavi solo usando per mostrare i progressi in una barra di avanzamento) .
D'altra parte, controllare che un indice su un array sia valido quando si preleva un elemento è un precondition
. Non esiste alcuna azione successiva ragionevole per l'oggetto array da eseguire quando viene richiesto un indice non valido, dal momento che lo deve restituire un valore non facoltativo a.
Testo integrale dalla documentazione (cercare l'opzione-clic assert
e precondition
in Xcode):
Presupposto
Controllare una condizione necessaria per fare in avanti il progresso.
Utilizzare questa funzione per rilevare le condizioni che devono impedire al programma di procedere anche nel codice di spedizione.
nei campi da gioco e -Onone costruisce (il valore di default per la configurazione di debug di Xcode): se condition
restituisce false, fermare il programma esecuzione in uno stato debuggable dopo la stampa message
.
In -O builds (l'impostazione predefinita per la configurazione di rilascio di Xcode): se condition
è false, interrompe l'esecuzione del programma.
In -Ounchecked build, condition
non viene valutata, ma l'ottimizzatore può supporre che sarebbe restituire true
. Fallimento per soddisfare tale ipotesi in build -Ounchecked è un grave errore di programmazione .
Assert
tradizionale stile C affermare, con un messaggio opzionale.
Utilizzare questa funzione per i controlli di integrità interna attivi durante il test, ma non influire sulle prestazioni del codice di spedizione. Per verificare l'utilizzo non valido nelle build di rilascio; vedi precondition
.
nei campi da gioco e -Onone costruisce (il valore di default per la configurazione di debug di Xcode): se condition
restituisce false, fermare il programma esecuzione in uno stato debuggable dopo la stampa message
.
In -O build (l'impostazione predefinita per la configurazione di rilascio di Xcode), condition
non viene valutata e non vi sono effetti.
In -Ounchecked build, condition
non viene valutata, ma l'ottimizzatore può supporre che sarebbe restituire true
. Fallimento per soddisfare tale ipotesi in build -Ounchecked è un grave errore di programmazione .
fonte
2015-04-16 11:36:08
"Ma non si vorrebbe spedire con quello, dal momento che il risultato out-of-bound * potrebbe * essere valido, e non critico quindi non dovrebbe mandare in crash la tua app" questo è molto vago per me. Gentilmente puoi includere un esempio esatto? Forse un po 'di codice. – Honey
Rispondendo alla tua domanda, personalmente uso asserzioni per catturare cose che non dovrebbero accadere nella mia build mentre sto scrivendo e testandolo. Immagina una dichiarazione di guardia che legge JSON dove 'data [" nome "]' non esiste, ma dovrebbe. Avere un'affermazione all'interno della guardia ... mi avrebbe aiutato a cogliere il mio errore andando in crash e portandomi al problema. Analogamente, se questo codice era in produzione, l'asserzione non mandava in crash il programma e qualsiasi codice di backup che usavo ('return nil') avrebbe preso il sopravvento. –