Ist nil und (NSString *) [NSNull null] äquivalent beim Prüfen eines leeren NSString-Objekts

7

Ich habe ein NSString -Objekt,

%Vor%

sind dann die beiden folgenden Versionen gleichwertig?

Version 1:

%Vor%

Version 2:

%Vor%

Referenzposts

  1. Unterschied zwischen null, null und null

  2. Wie erkennt man, ob NSString null ist?

  3. Apples NSNull-Klassenreferenz

  4. Wie? Ich prüfe, ob ein String in Ziel C leer ist?

Update - Testergebnis

Mein einfaches Testergebnis zeigt, dass die beiden obigen Versionen unterschiedliche Verhaltensweisen haben:

  1. Wenn aString initialisiert und dann mit nil zugewiesen wird:

    false für Ausdruck in Version 1,

    true für Ausdruck in Version 2.

  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%

Update - Was ich meine "Leere Zeichenfolge" **

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.

    
Cong 30.10.2013, 08:39
quelle

6 Antworten

29

[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] .

    
jbat100 30.10.2013, 08:45
quelle
3

sie sind nicht gleich, das NSNull ist ein gültiges Objekt (geerbt von NSObject ) gegenüber einem nil Zeiger, der auf nichts zeigt.

So können Sie überprüfen, ob ein Objekt ein NSNull -Objekt ist, aber Ihre erste Version ist auch in Ordnung.

%Vor%     
holex 30.10.2013 08:45
quelle
0

nil bedeutet nichts.
[NSNull null] ist ein Objekt, Instanz der Klasse NSNull
== bedeutet Gleichheit

something equals to something else ist nicht dasselbe wie something is equal to nothing

    
Sulthan 30.10.2013 08:42
quelle
0

[NSNull null] gibt die Singleton-Instanz von NSNull zurück.

aString == [NSNull null] vergleicht zwei Zeiger. Solange aString nicht auf den NSNull singleton zeigt, sind sie niemals gleich.

    
Sebastian 30.10.2013 08:43
quelle
0

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 }

    
Muruganandham K 30.10.2013 08:46
quelle
0
%Vor%

}

    
Mannam Brahmam 08.01.2016 06:27
quelle

Tags und Links