Ich muss das fragen, weil: Das einzige, was ich erkenne, ist, dass die App abstürzt, wenn die Behauptung fehlschlägt. Ist das der Grund, warum NSAssert verwendet wird? Oder was bringt es sonst noch? Und ist es richtig, einen NSAssert direkt über jede Annahme zu setzen, die ich im Code mache, wie eine Funktion, die niemals einen -1 als Parameter erhalten sollte, sondern einen -0,9 oder -1,1?
155
Ich kann nicht wirklich mit NSAssert sprechen, aber ich stelle mir vor, dass es ähnlich wie Cs assert () funktioniert.
assert () wird verwendet, um einen semantischen Vertrag in Ihrem Code durchzusetzen. Was heißt das, fragst du?
Nun, es ist wie Sie gesagt haben: Wenn Sie eine Funktion haben, die niemals eine -1 erhalten sollte, können Sie assert () dies erzwingen lassen:
Und jetzt sehen Sie so etwas im Fehlerprotokoll (oder STDERR):
Es schützt also nicht nur vor potenziell schlechten Eingaben, sondern protokolliert sie auch auf nützliche und standardmäßige Weise.
Oh, und zumindest in C war assert () ein Makro, sodass Sie assert () in Ihrem Release-Code als No-Op neu definieren konnten. Ich weiß nicht, ob dies bei NSAssert der Fall ist (oder sogar mehr behauptet ()), aber es war ziemlich nützlich, diese Prüfungen zu kompilieren.
quelle
NSAssert
bietet Ihnen mehr als nur einen Absturz der App. Es zeigt Ihnen die Klasse, Methode und die Zeile, in der die Zusicherung erfolgte. Alle Zusicherungen können auch einfach mit NS_BLOCK_ASSERTIONS deaktiviert werden. Dadurch eignet es sich besser zum Debuggen. Auf der anderen SeiteNSException
stürzt das Werfen eines nur die App ab. Es gibt auch keinen Hinweis auf den Ort der Ausnahme und kann auch nicht so einfach deaktiviert werden. Sehen Sie den Unterschied in den Bildern unten.Die App stürzt ab, weil eine Zusicherung auch eine Ausnahme auslöst , wie in der NSAssert-Dokumentation angegeben :
NSAssert:
NSException:
quelle
NSException
bietet zahlreiche Möglichkeiten, die über die Parameterreason
und zurückgegebene Ausgabe anzupassenuserInfo
. Es gibt keinen Grund, warum Sie Klassennamen, Selektor, Zeileninformationen und alles andere, was Sie hinzufügen möchten, nicht hinzufügen können, um das Debuggen zu unterstützen. IMHO, Sie verwenden einNSAssert
für Debugging-Zwecke während der Entwicklung, aber deaktivieren sie für den Versand; Sie werfen eine,NSException
wenn Sie in einer Aussage im Versandcode verlassen möchten.Abgesehen von dem, was alle oben gesagt haben, besteht das Standardverhalten von
NSAssert()
(im Gegensatz zu Csassert()
) darin, eine Ausnahme auszulösen, die Sie abfangen und behandeln können. Zum Beispiel macht Xcode dies.quelle
Um zu verdeutlichen, wie bereits erwähnt, aber nicht vollständig erklärt, ist der Grund für das Vorhandensein und Verwenden von Asserts, anstatt nur benutzerdefinierten Code zu erstellen (z. B. ifs und Auslösen einer Ausnahme für fehlerhafte Daten), dass Asserts für Produktionsanwendungen deaktiviert werden sollten.
Während der Entwicklung und des Debuggens werden Asserts aktiviert, damit Sie Fehler abfangen können. Das Programm wird angehalten, wenn eine Zusicherung als falsch bewertet wird. Beim Kompilieren für die Produktion lässt der Compiler jedoch den Assertionscode weg und lässt Ihr Programm schneller laufen. Bis dahin haben Sie hoffentlich alle Fehler behoben. Falls Ihr Programm während der Produktion immer noch Fehler aufweist (wenn Zusicherungen deaktiviert sind und das Programm die Zusicherungen "überspringt"), stürzt Ihr Programm wahrscheinlich an einem anderen Punkt ab.
Aus der Hilfe von NSAssert: "Zusicherungen sind deaktiviert, wenn das Präprozessor-Makro NS_BLOCK_ASSERTIONS definiert ist." Fügen Sie das Makro einfach [nur] in Ihr Verteilungsziel ein.
quelle
NSAssert
(und sein stdlib-Äquivalentassert
) dienen dazu, Programmierfehler während der Entwicklung zu erkennen. Sie sollten niemals eine Behauptung haben, die in einer (freigegebenen) Produktionsanwendung fehlschlägt. Sie könnten also behaupten, dass Sie niemals eine negative Zahl an eine Methode übergeben, die ein positives Argument erfordert. Wenn die Behauptung während des Testens jemals fehlschlägt, liegt ein Fehler vor. Wenn der übergebene Wert jedoch vom Benutzer eingegeben wird, müssen Sie die Eingabe ordnungsgemäß validieren, anstatt sich auf die Zusicherung in der Produktion zu verlassen (Sie können ein #define für Release-Builds festlegen, die deaktiviert werdenNSAssert*
.quelle
Behauptungen werden üblicherweise verwendet, um die beabsichtigte Verwendung einer bestimmten Methode oder Logik zu erzwingen. Angenommen, Sie haben eine Methode geschrieben, die die Summe von zwei Ganzzahlen größer als Null berechnet. Um sicherzustellen, dass die Methode immer wie beabsichtigt verwendet wurde, würden Sie wahrscheinlich eine Zusicherung machen, die diese Bedingung testet.
Kurze Antwort: Sie erzwingen, dass Ihr Code nur bestimmungsgemäß verwendet wird.
quelle
Es ist erwähnenswert, dass neben der Laufzeitprüfung die Assert-Programmierung eine wichtige Funktion ist, die beim Entwurf Ihres Codes im Vertrag verwendet wird.
Weitere Informationen zum Thema Geltendmachung und Vertragsgestaltung finden Sie weiter unten:
Behauptung (Softwareentwicklung)
Design im Vertrag
Programmieren mit Behauptungen
Design by Contract, by Example [Taschenbuch]
quelle
Um seine Frage vollständig zu beantworten, besteht der Sinn jeder Art von Behauptung darin, das Debuggen zu unterstützen. Es ist wertvoller, Fehler an ihrer Quelle abzufangen und sie dann im Debugger abzufangen, wenn sie Abstürze verursachen.
Sie können beispielsweise einen Wert an eine Funktion übergeben, die Werte in einem bestimmten Bereich erwartet. Die Funktion kann den Wert für die spätere Verwendung speichern und bei späterer Verwendung stürzt die Anwendung ab. Der in diesem Szenario angezeigte Aufrufstapel zeigt nicht die Quelle des fehlerhaften Werts an. Es ist besser, den schlechten Wert zu erfassen, um herauszufinden, wer den schlechten Wert übergibt und warum.
quelle
NSAssert
App zum Absturz bringen, wenn sie mit der Bedingung übereinstimmt. Wenn dies nicht mit der Bedingung übereinstimmt, werden die nächsten Anweisungen ausgeführt. Suchen Sie nach der EX unten:Ich erstelle einfach eine App, um zu testen, was die Aufgabe
NSAssert
ist:In meinem Code stürzt die App nicht ab. Und der Testfall ist:
anNum
> = 2 -> Die App stürzt nicht ab und Sie können die Protokollzeichenfolge sehen: "Diese Anweisung wird ausgeführt, wenn anNum <2" im Fenster der outPut-Protokollkonsole angezeigt wirdanNum
<2 -> Die App stürzt ab und Sie können die Protokollzeichenfolge nicht sehen: "Diese Anweisung wird ausgeführt, wenn anNum <2"quelle