Was ist NSParameterAssert?

84

Was ist NSParameterAssert?

Kann jemand mit Beispiel erklären?

senthilMuthu
quelle

Antworten:

115

Es ist eine einfache Möglichkeit zu testen, ob der Parameter einer Methode nicht niloder nicht 0 ist. Im Grunde genommen verwenden Sie ihn also, um eine Vorbedingung zu erstellen, in der angegeben wird, dass einige Parameter festgelegt werden müssen. Wenn es nicht festgelegt ist, bewirkt das Makro, dass die Anwendung abgebrochen wird, und generiert einen Fehler in dieser Zeile. So:

- (void)someMethod:(id)someObjectThatMustNotBeNil
{
  // Make sure that someObjectThatMustNotBeNil is really not nil
  NSParameterAssert( someObjectThatMustNotBeNil );
  // Okay, now do things
}

Voraussetzungen sind eine einfache Möglichkeit, um sicherzustellen, dass Methoden / API vom Programmierer korrekt aufgerufen werden. Die Idee ist, dass wenn ein Programmierer die Vorbedingung verletzt, die Anwendung vorzeitig beendet wird - hoffentlich während des Debuggens und der grundlegenden Tests.

NSParameterAssert kann verwendet werden, um zu testen, ob ein Ausdruck als wahr ausgewertet wird, sodass Sie ihn auch folgendermaßen verwenden können:

NSParameterAssert( index >= 0 ); // ensure no negative index is supplied

Apples Dokumentation für das Makro NSParameterAssert ()

Jason Coco
quelle
1
Stellen Sie sicher, dass Sie Ausnahmen in Ihrem Code abfangen. Andernfalls stürzt Ihre App ab, wenn die Zusicherung wahr ist.
Lucius
14
@lucius: Asserts dürfen nicht zum Überprüfen von Bedingungen in einer verteilten Anwendung verwendet werden, sondern dienen dazu, Fehler während der Entwicklung abzufangen. Wenn Sie bei einem schlechten Zustand (z. B. einer nicht angeschlossenen Steckdose zu einer Feder) einen Absturz verursachen, anstatt lautlos zu versagen, können Sie Probleme frühzeitig feststellen. Viele Leute deaktivieren diese zur Verteilungszeit über Makros oder #ifdefs.
Brad Larson
5
@lucius - Ziel ist es, die Anwendung abzubrechen, wenn die Voraussetzungen nicht erfüllt sind. Dadurch wird dem Programmierer sofort mitgeteilt, dass er etwas falsch gemacht hat. Um sicherzustellen, dass Zusicherungen in Cocoa nicht ausgewertet werden, können Sie das Makro NS_BLOCK_ASSERTIONS definieren. Dies deaktiviert sie, aber die Idee ist, zu verhindern, dass Nebenwirkungen oder langsamer Code ausgeführt werden, anstatt sich vor Abstürzen zu schützen - bei der Produktion sollten Behauptungen bei korrekter Verwendung niemals ausgelöst werden.
Jason Coco
1
Ist es möglich, diese Zusicherungen bei Produktionsaufbauten auf einfache Weise zu entfernen? IMHO werden diese am besten während der Entwicklung verwendet, um Programmierfehler zu erkennen (wie im obigen Kommentar erwähnt).
Johan Karlsson
5
@JohanKarlsson Es ist möglich und standardmäßig in den aktuellen Versionen von Vorlagen (dies geht ziemlich weit zurück) in der ReleaseKonfiguration festgelegt. Sie können dies steuern, indem Sie die ENABLE_NS_ASSERTIONSBuild-Einstellungen in neueren Versionen von Xcode festlegen oder das NS_BLOCK_ASSERTIONSMakro definieren und auf 1 setzen. In Xcode 5 gibt es eine Projekteinstellung * Foundation Assertions aktivieren`, mit der die Build-Einstellungen und Standardeinstellungen Yesin Debugund Noin festgelegt werden ReleaseKonfigurationen.
Jason Coco