Ich habe dies in meiner iPhone App verwendet
if (title == nil) {
// do something
}
Es wird jedoch eine Ausnahme ausgelöst, und die Konsole zeigt an, dass der Titel "(null)" lautet.
Also benutze ich das jetzt:
if (title == nil || [title isKindOfClass:[NSNull class]]) {
//do something
}
Was ist der Unterschied und wie lässt sich am besten feststellen, ob eine Zeichenfolge null ist?
ios
objective-c
cocoa-touch
Teo Choong Ping
quelle
quelle
Antworten:
Wie andere betont haben, gibt es unter Cocoa / Objective C viele Arten von "null". Eine weitere zu beachtende Sache ist jedoch, dass [title isKindOfClass: [NSNull class]] sinnlos komplex ist, da [NSNull null] als a dokumentiert ist Singleton, sodass Sie nur die Zeigergleichheit überprüfen können. Siehe Themen für Kakao: Verwenden von Null .
Ein guter Test könnte also sein:
Beachten Sie, wie Sie die Tatsache nutzen können, dass title.length auch dann, wenn title nil ist, 0 / nil / false zurückgibt, dh in diesem Fall 0, sodass Sie keinen Sonderfall eingeben müssen. Dies ist etwas, an das sich Personen, die mit Objective C noch nicht vertraut sind, nur schwer gewöhnen können, insbesondere wenn sie aus anderen Sprachen kommen, in denen Nachrichten / Methodenaufrufe zum Absturz führen.
quelle
Map
der Wert eines Gegenstands - dernull
in Dart steht - nicht mitnil
oderNULL
in Ziel C übereinstimmt . Der Grund war, dass es tatsächlichNUNull null
nicht dieNULL
Null ist. Vielen Dank, dass Sie @PeterNLewis!es ist genauso einfach wie
Denken Sie daran, dass in Ziel C, wenn das Objekt null ist, 0 als Wert zurückgegeben wird.
Dadurch erhalten Sie sowohl eine Nullzeichenfolge als auch eine Zeichenfolge mit der Länge 0.
quelle
object = @"";
oderobject = nil;
)Lesen Sie die folgenden Artikel auf dieser Website:
Ich denke, Ihr Fehler hängt mit etwas anderem zusammen, da Sie die zusätzliche Überprüfung nicht durchführen müssen.
Siehe auch diese verwandte Frage: Richtige Überprüfung der Null-SQLite-Textspalte
quelle
Ich habe festgestellt, dass man etwas Ähnliches tun muss, um es wirklich richtig zu machen
Andernfalls kommt es zu seltsamen Situationen, in denen die Kontrolle Ihre Prüfung immer noch umgeht. Ich bin nicht auf einen gestoßen, der es über die
isEqual
und Längenprüfungen hinaus schafft .quelle
Was ist mit all diesen "funktioniert für mich Antworten"? Wir codieren alle in derselben Sprache und die Regeln sind
Das wird für alle funktionieren. Wenn eine bestimmte Lösung nur "für Sie funktioniert", liegt dies nur daran, dass Ihr Anwendungsfluss kein Szenario zulässt, in dem die Referenz null oder die Zeichenfolgenlänge 0 sein kann. Der richtige Weg, dies zu tun, ist die Methode, die behandelt wird was Sie in allen Fällen wollen.
quelle
nil
(Hinweis: nicht "null") lautet , wird beim Senden einer Nachricht wie "length
0" (oder der entsprechende 0-Wert für den Rückgabetyp der Methode) ausgegeben. Das ist die Regel der Sprache.nil
In diesem Fall muss nicht separat nachgefragt werden.Wenn Sie gegen alle null / leeren Objekte (wie leere Zeichenfolgen oder leere Arrays / Sets) testen möchten, können Sie Folgendes verwenden:
quelle
Es gibt zwei Situationen:
Es ist möglich, dass ein Objekt ist
[NSNull null]
oder es ist unmöglich.Ihre Anwendung sollte normalerweise nicht verwendet werden. Verwenden
[NSNull null];
Sie sie nur, wenn Sie ein " null " -Objekt in ein Array einfügen oder als Wörterbuchwert verwenden möchten . Und dann sollten Sie wissen, welche Arrays oder Wörterbücher Nullwerte enthalten können und welche nicht.Wenn Sie der Meinung sind, dass ein Array niemals
[NSNull null]
Werte enthält , suchen Sie nicht danach. Wenn es eine gibt[NSNull null]
, erhalten Sie möglicherweise eine Ausnahme, aber das ist in Ordnung: Objective-C-Ausnahmen weisen auf Programmierfehler hin. Und Sie haben einen Programmierfehler, der durch Ändern von Code behoben werden muss.Wenn ein Objekt könnte sein
[NSNull null]
, dann überprüfen Sie diese ganz einfach durch die Prüfung(object == [NSNull null])
. Das AufrufenisEqual
oder Überprüfen der Klasse des Objekts ist Unsinn. Es gibt nur ein[NSNull null]
Objekt, und der einfache alte C-Operator prüft es auf einfachste und effizienteste Weise.Wenn Sie ein
NSString
Objekt überprüfen , das nicht sein kann[NSNull null]
(weil Sie wissen, dass es nicht sein kann,[NSNull null]
oder weil Sie gerade überprüft haben, dass es sich von unterscheidet[NSNull null]
, müssen Sie sich fragen, wie Sie eine leere Zeichenfolge behandeln möchten, die eine mit der Länge 0 ist Wenn es sich um einenull
Zeichenfolge handeltnil
, gibt test(object.length == 0)
. object.length 0 if zurückobject == nil
. Dieser Test deckt also keine Objekte und Zeichenfolgen mit der Länge 0 ab. Wenn Sie eine Zeichenfolge mit der Länge 0 behandeln, die sich von einer Nullzeichenfolge unterscheidet, überprüfen Sie einfach, obobject == nil
.Wenn Sie einem Array oder einem Wörterbuch eine Zeichenfolge hinzufügen möchten und die Zeichenfolge möglicherweise Null ist, haben Sie die Wahl, sie nicht hinzuzufügen, durch zu ersetzen
@""
oder durch zu ersetzen[NSNull null]
. Wenn Sie es durch ersetzen,@""
verlieren Sie die Fähigkeit, zwischen "no string" und "string of length 0" zu unterscheiden.[NSNull null]
Wenn Sie es durch ersetzen , müssen Sie Code schreiben, wenn Sie auf das Array oder Wörterbuch zugreifen, das nach[NSNull null]
Objekten sucht.quelle
Sie suchen nur nach Null
oder
quelle
MAKRO-Lösung (2020)
Hier ist das Makro, das ich für eine sichere Zeichenfolge verwende, anstatt " (null) " - Zeichenfolge auf einem UILabel zu erhalten, zum Beispiel:
Angenommen, Sie haben eine Memberklasse und eine Namenseigenschaft, und der Name ist null:
mit Makro:
schön und sauber 😊
Erweiterungslösung (2020)
Wenn Sie es vorziehen, in Ihrem Projekt null Null und eine leere Zeichenfolge zu überprüfen, können Sie meine Erweiterungszeile unten verwenden:
NSString + Extension.h
NSString + Extension.m
Beispiel Verwendung
quelle
quelle
Versuchen Sie dies für check null
quelle
Dies würde mit den folgenden Fällen funktionieren,
NSString *strOne = @""
ODERNSString *strOne = @"StackOverflow"
ODERNSString *strOne = [NSNull null]
ODERNSString *strOne
.quelle
Wenn so etwas noch nicht existiert, können Sie eine NSString-Kategorie erstellen:
quelle
Was für mich funktioniert ist
if ( !myobject )
quelle
NSArray *testarray = [NSArray arrayWithObjects:[NSNull null],@"", nil]; NSString *string = [testarray objectAtIndex:0]; NSLog(@"null string value: %@",string); if (!string) { NSLog(@"string evaluates to null"); } if (string && (string==(id)[NSNull null])) { NSLog(@"string does not evaluate to null"); }
Die vollständige Überprüfung einer Zeichenfolge auf Nullbedingungen kann wie folgt erfolgen: <\ br>
quelle
Ich überprüfe nur Nullzeichenfolgen mit
quelle
quelle
quelle
Für Zeichenfolge:
}}
Siehe das Bild unten:
quelle
Für Zeichenfolge:
quelle