Ich habe ein NSString
-Objekt,
sind dann die beiden folgenden Versionen gleichwertig?
Version 1:
%Vor%Version 2:
%Vor%Mein einfaches Testergebnis zeigt, dass die beiden obigen Versionen unterschiedliche Verhaltensweisen haben:
Wenn aString
initialisiert und dann mit nil
zugewiesen wird:
false
für Ausdruck in Version 1,
true
für Ausdruck in Version 2.
Wenn aString
mit dem Wert von @""
initialisiert wird.
false
für Ausdruck in Version 1,
false
für Ausdruck in Version 2.
Es ist also klar, dass die beiden Versionen in ihrem Verhalten nicht gleichwertig sind.
Der Testcode:
%Vor%Konsolenausgabe:
%Vor% Nun habe ich klargestellt, dass es für ein NSString
-Objekt anders sein muss, um nil
zu sein, und dass es eine gültige initialisierte Instanz ist, die einen leeren String-Wert von @""
enthält. Was ich wirklich in diesem Beitrag brauche ist, dass getestet wird, ob mein NSString
-Objekt erfolgreich initialisiert wurde, das heißt, ob aString
ist nil
. Ich möchte wissen, ob es einen Unterschied für die obigen zwei Versionen des Testcodes gibt.
[NSNull null]
und nil
sind nicht gleichwertig. [NSNull null]
soll das Konzept von NULL (wie in keinem Objekt) in Fällen darstellen, in denen nil
nicht verwendet werden kann, zum Beispiel in NSArray
(da Sie nur Objekte in sie einfügen können). [NSNull null]
ist ein Objekt (immer das gleiche Objekt), während nil
ein Zeiger auf 0 ist.
NSHipster hat eine nette Diskussion hier . Er sagt:
NSNull wird in Foundation und anderen Frameworks verwendet um die Einschränkungen von Sammlungen wie NSArray und NSDictionary nicht in der Lage sein, Nullwerte zu enthalten. Sie können sich NSNull als effektiv den NULL- oder NULL-Wert zu verpacken, so dass es in verwendet werden kann Sammlungen.
Wenn Sie:
%Vor% Dann stimmt etwas nicht, aString
sollte auf ein NSString
-Objekt (oder eine Unterklasse) oder nil
zeigen. Aber nicht [NSNull null]
, das ein Objekt einer anderen Klasse ist, sollten Sie nicht von einem zum anderen werfen.
BEARBEITEN:
In den Kommentaren geben Sie an, dass Sie überprüfen möchten, ob die Zeichenfolge leer ist (wie in @""
), das ist anders. Sehen Sie sich diese Frage an. Eine leere Zeichenfolge ist ein NSString
-Objekt, nicht nil
und nicht [NSNull null]
.
Wenn Sie einen String mit nil vergleichen möchten:
1. if (aString.length == 0)
{
}
2.if (sString isEqualToString: @ "")
{
}
3.if (aString! = Null)
{
} sonst
{
// mach deine Sachen hier
}
Tags und Links objective-c nsstring null nsnull