Co to jest NSParameterAssert?

84

Co to jest NSParameterAssert?

Czy ktoś może wyjaśnić na przykładzie?

senthilMuthu
źródło

Odpowiedzi:

115

Jest to prosty sposób na sprawdzenie, czy parametr metody nie jest nilrówny 0. Zasadniczo używasz go do utworzenia warunku wstępnego, stwierdzając, że należy ustawić jakiś parametr. Jeśli nie jest ustawiona, makro powoduje przerwanie aplikacji i generuje błąd w tym wierszu. Więc:

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

Warunki wstępne to prosty sposób na zapewnienie, że metody / API są poprawnie wywoływane przez programistę. Chodzi o to, że jeśli programista naruszy warunek wstępny, aplikacja zakończy się przedwcześnie - miejmy nadzieję, podczas debugowania i podstawowych testów.

NSParameterAssert można jednak użyć do sprawdzenia, czy każde wyrażenie zostanie uznane za prawdziwe, więc można go również użyć w ten sposób:

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

Dokumentacja firmy Apple dotycząca makra NSParameterAssert ()

Jason Coco
źródło
1
Upewnij się, że wychwytujesz wyjątki w kodzie, w przeciwnym razie, jeśli Assert jest true, spowoduje awarię aplikacji.
lucius
14
@lucius: potwierdzenia nie służą do sprawdzania warunków w aplikacji rozproszonej, służą do wychwytywania błędów podczas programowania. Spowodowanie awarii czegoś w złym stanie (np. Niepołączone gniazdko ze stalówką), zamiast cichej awarii, pozwala wcześnie wykrywać problemy. Wiele osób wyłącza je w czasie dystrybucji za pomocą makr lub #ifdefs.
Brad Larson
5
@lucius - celem jest spowodowanie przerwania działania aplikacji, gdy warunki wstępne nie są spełnione. Dzięki temu programista natychmiast wie, że zrobił coś złego. Aby upewnić się, że potwierdzenia w kakao nie są oceniane, można zdefiniować makro NS_BLOCK_ASSERTIONS. To je wyłącza, ale chodzi o to, aby raczej zapobiegać skutkom ubocznym lub powolnemu wykonywaniu kodu, niż chronić się przed awarią - przez produkcję asercje nigdy nie powinny się uruchamiać, jeśli są używane poprawnie.
Jason Coco
1
Czy można usunąć te potwierdzenia w prosty sposób podczas tworzenia kompilacji produkcyjnych? IMHO są najlepiej używane podczas programowania do wychwytywania błędów programistycznych (jak wspomniano w komentarzu powyżej).
Johan Karlsson,
5
@JohanKarlsson Jest to możliwe i ustawione domyślnie w aktualnych wersjach szablonów (to się dość daleko wstecz) w Releasekonfiguracji. Możesz to kontrolować, ustawiając ustawienia ENABLE_NS_ASSERTIONSkompilacji w nowszych wersjach Xcode lub definiując NS_BLOCK_ASSERTIONSmakro i ustawiając je na 1. W Xcode 5 jest ustawienie projektu * Enable Foundation Assertions, które ustawia ustawienia kompilacji i domyślnie na Yesin Debugi Noin Releasekonfiguracje.
Jason Coco,