Frage

Was ist der Unterschied zwischen NSNumber und NSInteger? Gibt es mehr Primitiven wie diese, die ich wissen sollte? Gibt es einen für Schwimmer?

War es hilfreich?

Lösung

Die vorhandenen Antworten sind hilfreich; Hinzufügen zu ihnen:

Ja, gibt NSUInteger die zweimal Bereich unter positiven ganzen Zahlen als NSInteger, aber ich denke, eine andere kritische Grund zwischen den beiden zu wählen ist einfach unter Fälle zu unterscheiden wobei negative Werte einfach keinen Sinn machen .

Beispiel: der Rückgabewert von NSArray Methode des count ist ein NSUInteger, was Sinn macht, da wir nicht ein Array mit einer negativen Zahl von Elementen haben. Wenn der Codierer weiß ist es nicht unterzeichnet, er / sie mehr Freiheit hat, um Operationen durchzuführen, die in der signierten Fall unzuverlässig sein könnte, einschließlich bitweise Operationen wie Verschieben. diesem Blog-Post Gespräche mehr über unterzeichnet vs unsigned.

Meine Vermutung über CGFloat vs NSFloat (was nicht existiert): Es könnte der Fall sein, dass die Designer der Nextstep genannten Codeelemente einfach nicht zu viele Schwimmer Werte angegeben haben müssen außerhalb der Zeitintervalle. So gaben sie NSTimeInterval, die ein Floating-Point-Typ ist, aber das eindeutig für die Verwendung mit Zeitintervallen bestimmt. Und, ehrlich gesagt, ist es toll, diese Art zu haben, weil Sie wissen, dass es immer in Sekunden sein sollten, ohne mit einer Struktur zu beschäftigen. Wenn Sie in die Grafikwelt bewegen (wo Core Graphics lebt), plötzlich schwimmt alle um dich herum sind, in der Luft schweben (haha). So macht es Sinn, einen CGFloat dort einzuführen. Dieser Absatz ist all „gebildete Spekulation.“

Auch nur klar zu sein über , warum Sie verwenden NSInteger etc statt primitiven Typen : Da diese Art und Weise ist es einfacher, portablen Code zu schreiben, die alle Vorteile der Maschinenarchitektur nimmt. Zum Beispiel verwendet ein CGFloat 32 Bit auf einigen Maschinen und 64 Bit auf andere, abhängig davon ab, wie viel von einer Effizienzlücke gibt für diese Größen auf diesen Maschinen ist. In einigen Fällen gibt es keinen wirklichen Speedup für die Verwendung von 32-Bit-vs 64 Bit, so dass Sie möglicherweise auch 64 Bit verwenden. Wenn Sie die Dinge wie CGFloat erklärte haben, erhalten Sie plötzlich, dass zusätzliche Präzision „kostenlos“, wenn Sie neu kompilieren.

Und wie iKenndac hervorgehoben hat, NSNumber ist eine Wrapper-Klasse für alle diesen (und anderen primitiven oder quasi-primitive Typen wie die BOOL), die Sie es in Ihrem NSArrays aufzunehmen ermöglicht und NSDictionarys, archivieren sie leichter und andere Dinge tun, die NSObjects tun können.

Andere Tipps

NSNumber ist eine Klasse, nicht eine primitive, und wird verwendet, wenn Sie rohen Zahlen in Wörterbücher, Arrays setzen müssen, oder auf andere Weise zu kapseln. NSInteger, NSUInteger, CGFloat, usw. sind einfache Typen und entsprechen (auf 32-bt Systeme wie das iPhone) int, unsigned int und float.

Als allgemeine Regel gilt, wenn Sie eine Nummer irgendwo speichern müssen, verwenden Sie NSNumber. Wenn Sie tun Berechnungen, Schleifen, etc., Verwendung NSInteger, NSUInteger oder CGFloat.

Sie können eine NSInteger in eine NSNumber wickeln:

NSNumber *aNumber = [NSNumber numberWithInteger:21];

... und bekommt sie zurück:

NSInteger anInteger = [aNumber integerValue];

Sie können hier weitere Informationen finden Sie heraus: http://iosdevelopertips.com/cocoa /nsnumber-and-nsinteger.html

NSInteger ist wie ein traditionelles int in C. Es ist ein typedef. Es gibt andere, wie NSUInteger, CGFloat, etc., die alle sind Synonyme für primitive Typen.

NSNumber ist nützlich, wenn Sie eine Zahl in einer NSArray oder NSDictionary haften müssen. Die gängige Praxis ist diese Sammlungen zu verwenden im Vergleich zu Ihrem eigenen Fahrzeugen; Der Nachteil ist, dass sie nur Objective-C-Objekte enthalten können.

NSNumber wickelt im Wesentlichen einen int (oder Schwimmer, usw.) in ein Obj-C-Objekt (ähnlich wie C # / Java Konzept der 'Box' eine primitiven Art), die zu einem Array hinzugefügt werden können:

NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok

Aus Gründen der Performance, wenn Sie können, primitive Typen verwenden (wie int, float, int []). Aber manchmal kann man nicht NSArray / NSNumber, wie wenn Sie lesen oder zu schreiben Einträge in eine Datei .plist vermeiden.

NSNumber allgemein für die Speicherung von Variablen verwendet wird, wird NSUInteger für Arithmetik verwendet

Sie können eine NSNumber zu einem NSUInteger ändern, indem Sie diese:

NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];

Es ist gesagt worden, bevor aber als allgemeine Faustregel gilt: Variablen, die mit * definiert werden müssen, sind Objective C-Klassen, während Variablen, die C-Primitiven keine * benötigen.

Wie bereits von anderen gesagt, NSNumber ist eine NSObject Unterklasse. Es ist kein C primitive ( wie int, unsigned int, float, double, etc. ) NSInteger, CGFloat, NSUInteger sind einfach typedefs über die C-Primitiven.

Der Bedarf an NSNumber ergibt sich aus der Notwendigkeit, Zahlen als Parameter an APIs zu verwenden, die Objekte erfordern. Beispiel ist, wenn Sie eine Nummer in einer NSArray, In-Core-Data oder in einem NSDictionary speichern möchten.

Gibt es mehr Primitiven wie diese, die ich wissen sollte? Nun, NSNumber ist kein primitiver Typ, und es wickelt sich um alle Arten von Zahlen (Schwimmer, integrale Typen, booleans und so weiter). Sie sollten auch lernen, über NSValue, die die Basis für NSNumber ist.

Gibt es einen für Schwimmer? Es gibt keinen „NS“ typedef für Schwimmer, aber NSNumber kann jede Gleitkommazahl umschlingen:

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];

Oder Sie könnten die Core Graphics Urtyp CGFloat verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top