Frage

  1. NSString *myString = @"Hello";

  2. NSString *myString = [NSString stringWithString:@"Hello"];

I verstehen, dass Verfahren unter Verwendung von (1) einen Zeiger auf einen String-Literal erzeugt, die als statischen Speicher definiert ist (und nicht freigegeben werden kann) und dass die Verwendung von (2) erzeugt ein NSString Objekt, das Autoreleased wird.

  • Wird mit der Methode (1) schlecht?
  • Was sind die wichtigsten Unterschiede?
  • Gibt es Fälle, in denen Sie verwenden möchten würden (1)?
  • Sie haben einen Performance-Unterschied?

P. S. Ich habe ausführlich auf Stack-Überlauf gesucht und während es Fragen zum gleichen Thema ist, keiner von ihnen hat Antworten auf die Fragen, die ich oben gepostet habe.

War es hilfreich?

Lösung

Wie bereits in diese Antwort Stringliterale sind unveränderlich String-Objekte und ihre Adresse in der Kompilierung-Zeit bekommen - so dass Sie mehrere Instanzen derselben Zeichenkette erstellen während der Laufzeit nicht müssen.

NSString *myString = @"Hello";

So wir hier nur assign myString auf den Zeiger auf Stringliteral.

NSString *myString = [NSString stringWithString:@"Hello"];

Die zweite Zeile erstellt Objekt Bequemlichkeit Konstruktor, aber wie wir es zu tun haben unveränderliche Objekte hier führt sie auf den gleichen Zeigerwert zu Stringliteral - so dass Sie das gleiche Ergebnis wie in der 1. Variante bekommen (wenn auch wahrscheinlich einige zusätzliche Methoden durchführen Anrufe).

So scheint es, dass Varianten Sie das gleiche tun erwähnt, aber der 2. kann man auch einige zusätzliche Anrufe durchführen.

Kleine Probe veranschaulicht, was passiert:

NSString* tString = @"lala";
NSString* tString2 = @"lala";   
NSString* tString3 = [NSString stringWithString:@"lala"];
NSString* tString4 = [NSString stringWithFormat:@"%@", @"lala"];

NSLog(@"%p %d", tString, [tString retainCount]);
NSLog(@"%p %d", tString2, [tString2 retainCount]);
NSLog(@"%p %d", tString3, [tString3 retainCount]);
NSLog(@"%p %d", tString4, [tString4 retainCount]);

Ausgabe:

 0xd0418 2147483647
 0xd0418 2147483647
 0xd0418 2147483647
 0x50280e0 1
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top