Was ist der Unterschied zwischen NSNumber und NSInteger?
-
18-09-2019 - |
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?
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 NSArray
s aufzunehmen ermöglicht und NSDictionary
s, archivieren sie leichter und andere Dinge tun, die NSObject
s 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.