Tut Objective-C short-circuit-evaluation?
Habe ich versucht, etwas entlang der Linien von:
if(myString != nil && myString.length) { ... }
Und bekam:
-[NSNull Länge]: unrecognized selector geschickt Instanz
Nicht in Objective-C, nicht kurzschlussfest, nach der ersten Bedingung scheitert?
- Ist
NSNull
gleichnil
? - NÖ. NSNull und null sind nicht das gleiche. Überhaupt nicht.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Objective-C unterstützt short-circuit evaluation, wie C.
Es scheint, dass in Ihrem Beispiel
myString
istNSNull
und nichtnil
dahermyString != nil
wahr ist.NSNull ist ein singleton und wird verwendet, um darzustellen
nil
wo nur Objekte erlaubt sind, zum Beispiel in einem NSArray.Btw, normalerweise schreiben die Leute
if (!myString && myString.length == 0)
. Im Vergleich zunil
ist ziemlich hässlich. Auch, ich würde vergleichen Sie die Länge auf 0. Das scheint mehr klar.if (nil == myString)
stattif (!myString)
Sie sind falsch.nil
ist definiert als 0 ist und daher die beiden Vergleiche sind genau die gleichen.if(myString.length) {...}
und es dabei belassen, denn wenn myString ein null-Objekt und senden Sie eine lange Nachricht, die Sie bekommen null sowieso.Objective-C ist eine strikte Obermenge von C.
Weil C unterstützt short-circuit-evaluation, Objective-C als auch nicht.
||
operator ist entweder1
oder0
nie etwas anderes).Was ist NSNull definiert als? Wenn es ein Objekt ist, das soll, stellen nichts anderes dar, als wäre es nicht null. in anderen Worten, NSNull und null sind nicht das gleiche.
Wenn Sie eine NSNull irgendwo, Sie sind wahrscheinlich entweder mit einem JSON-parser oder CoreData. Wenn eine Zahl in CoreData ist nicht festgelegt, CoreData, wird dir NSNull - eventuell das gleiche gilt für die NSString-Werte in CoreData zu.
Ebenso können Sie leere Elemente im JSON-Format von einem server zurückgegeben und einige Parser geben Sie als NSNull Objekt. Also in beiden Fällen, Sie müssen vorsichtig sein, wenn Sie Werte, weil Sie das, was Sie dachte, war ein NSString oder NSNumber-Objekt ist wirklich NSNull.
One-Lösung ist die Definition einer Kategorie auf NSNull, der ignoriert einfach alle nicht-verstanden-Nachrichten an das Objekt gesendet, wie in den folgenden code ein. Dann den code, den Sie haben, funktionieren würde, da NSNull.Länge würde 0 zurückgeben. Sie können so etwas wie dies in Ihrem Projekt .pch-Datei, die wird enthalten in jeder einzelnen Datei in Ihrem Projekt.
NSNull
stattnil
Ihr code macht, dass Sie weniger wahrscheinlich zu geschehen. In der Frage Beispiel gibt es eine Fehlermeldung mitNSNull
Sie würde nicht sehen, dass Sie mit Ihrem code undif (myString)
wäre noch zu true ausgewertet werden.NSNull
.NSMethodSignature *sig=[self methodSignatureForSelector:aSelector];