Ich sehe NSInteger wird ziemlich oft verwendet und die Typedef für es auf dem iPhone ist eine lange, also technisch könnte ich es verwenden, wenn ich Int (64) Werte erwarten. Aber sollte ich expliziter sein und etwas wie int64_t oder long direkt benutzen? Was wäre der Nachteil, nur lang zu verwenden?Wie soll ich ein Long in Objective-C deklarieren? Ist NSInteger geeignet?
Antwort
IIRC, long
auf dem iPhone/ARM ist 32 Bit. Wenn Sie eine garantierte 64-Bit-Ganzzahl wünschen, sollten Sie (tatsächlich) int64_t
verwenden.
Wenn Sie eine bestimmte bekannte Größe benötigen, verwenden Sie den Typ mit der bekannten spezifischen Größe: int64_t
. Wenn Sie einen generischen Integertyp benötigen und die Größe nicht wichtig ist, gehen Sie voran und verwenden Sie int
oder NSInteger
.
NSInteger's Länge hängt davon ab, ob Sie für 32 Bit oder 64 Bit kompilieren. Es ist definiert als lang für 64 Bit und iPhone und Int für 32 Bit.
Also auf iPhone die Länge von NSInteger ist die gleiche wie die Länge einer langen, die compilerabhängig ist. Die meisten Compiler haben die gleiche Länge wie das ursprüngliche Wort. d.h. 32 Bit für 32-Bit-Architekturen und 64 Bit für 64-Bit-Architekturen.
Angesichts der Unsicherheit über die Breite von NSInteger, verwende ich es nur für Arten von Variablen in der Cocoa API verwendet werden, wenn NSInteger angegeben ist. Wenn ich einen Typ fester Breite brauche, gehe ich zu den in stdint.h
definierten. Wenn mir die Breite egal ist benutze ich die eingebauten Typen
Wenn Sie etwas so lange deklarieren wollen, deklarieren Sie es als lang. Beachten Sie, dass je nach Compiler 32 oder 64 Bit lang sein können.
Wenn Sie etwas so effizient wie möglich und groß genug zum Zählen von Elementen deklarieren möchten, verwenden Sie NSInteger oder NSUInteger. Beachten Sie, dass beide 32 oder 64 Bits lang sein können und je nach Compiler tatsächlich unterschiedliche Typen (int oder long) sein können. Das schützt Sie in manchen Fällen vor Verwechslungen.
Wenn Sie 32 oder 64 Bit und nichts anderes möchten, verwenden Sie int32_t, uint32_t, int64_t, uint64_t. Beachten Sie, dass jeder Typ bei einigen Compilern unnötig ineffizient sein kann.
Integer-Datentypen Größen
short
- ILP32: 2 Byte; LP64: 2 Byteint
- ILP32: 4 Byte; LP64: 4 Bytelong
- ILP32: 4 Byte; LP64: 8 Byteslong long
- ILP32: 8 Bytes; LP64: 8 Byte
kann es nützlich sein zu wissen, dass:
Der Compiler definiert die
__LP64__
Makro, wenn für die 64-Bit-Laufzeit zu kompilieren.
NSInteger
ist ein typedef
von long
so wird es 32-Bits in einer 32-Bit-Umgebung und 64-Bits in einer 64-Bit-Umgebung sein.
Wenn auf 64-Bit-Konvertierung können Sie einfach alle zu NSInteger
Ihre int
s und long
s ersetzen und Sie sollte gut zu gehen.
Wichtig: achten Sie auf die Ausrichtung von Daten, LP64 verwendet natürliche Ausrichtung für alle Integer-Datentypen aber ILP32 verwendet 4 Bytes für alle Integer-Datentypen mit einer Größe gleich oder größer als 4 Byte.
Sie können mehr über 32 bis 64-Bit-Konvertierung im Official 64-Bit Transition Guide for Cocoa Touch lesen.
Beantworten Sie Fragen:
Wie soll ich eine lange in Objective-C erklären? Ist NSInteger geeignet?
können Sie verwenden entweder long
oder NSInteger
aber NSInteger
mehr idiomatische IMHO ist.
Aber sollte ich expliziter sein und etwas wie int64_t oder long direkt verwenden?
Wenn Sie konsistente 64-Bit-Größen weder long
noch NSInteger
tun erwarten, müssen Sie int64_t
verwenden (wie Wevah sagte).
Was wäre der Nachteil gerade lang mit?
Es ist nicht idiomatisch und Sie haben möglicherweise Probleme, wenn Apple wieder eine neue Architektur einrichtet.
- 1. ObjectiveC: Wo private Instanzeigenschaften deklarieren?
- 2. Soll NSInteger wirklich überall verwendet werden?
- 3. Wie deklarieren und verwenden Sie 3-dimensionale Array in ObjectiveC?
- 4. 2D Dynamische Speicherzuweisung - ObjectiveC
- 5. Implizite Konvertierung verliert ganzzahlige Genauigkeit: 'long long' zu 'NSInteger' (aka 'int')
- 6. In Code Igniter, wo soll ich meine globalen Variablen deklarieren?
- 7. Wie konvertiert man ein Double zu NSInteger?
- 8. Kann ich einen ObjectiveC @selector in ein NSDictionary einfügen?
- 9. Ist ein Struct für Konstanten geeignet?
- 10. Ist SQLite für ein Forum geeignet?
- 11. Wie printf ein unsigned long long int (der Formatbezeichner für unsigned long long int)?
- 12. Verketten Sie einen NSInteger mit NSInteger
- 13. Welcher Algorithmus ist geeignet?
- 14. Überprüfen, ob ein NSInteger gerade oder ungerade ist
- 15. Ist Smartclient geeignet?
- 16. Soll ich eine Variable innerhalb oder außerhalb der Hauptfunktion deklarieren?
- 17. AMF0 Parser in ObjectiveC
- 18. Protokoll deklarieren wie @class
- 19. ObjectiveC - wie NSUserNotification Kennung Eigenschaft
- 20. Wie soll ich ein OpenGLES ModelView in ein CATransform3D übersetzen?
- 21. Wie soll ich ein Thumbnail-Bild erzeugen?
- 22. Wie soll ich ein Benutzerpräferenzattribut erstellen?
- 23. Wie soll ich ein .NET-Programm transponieren?
- 24. Wie entwerfe ich ein Spiel in Unity3D, das zum Patchen geeignet ist?
- 25. Ist Panda's DataFrame dafür geeignet?
- 26. Wie kann ich das erreichen? Wäre ein Cursor geeignet?
- 27. (Wie) soll ich ein uv_async_t zerstören?
- 28. Wie kann ich ein nicht beschreibbares Array in C# deklarieren?
- 29. Soll ich ein WebView verwenden?
- 30. Warum erkläre ich NSInteger nicht mit einem *
Ja, NSInteger wird der native Worttyp sein. – Chuck
Auf x86 'long' ist auch 32-bit. – kennytm
@KennyTM: Das hängt vom Betriebssystem und den Compilern ab, nicht nur von der Hardware. –