2009-11-17 20 views
83

Zum Beispiel beim Passieren einer value Nachricht an eine NSInteger Instanz wie soWie konvertiert man einen NSInteger zu einem int?

[a value] es eine EXC_BAD_ACCESS verursacht.

Also, wie konvertiert man NSInteger zu int?

Wenn es relevant ist, werden nur kleine Zahlen < 32 verwendet.

+2

Sie scheinen ziemlich verwirrt zu sein. [ein Wert] legt nahe, dass Sie erwarten, dass ein Objekt ein Objekt ist, aber dass es im Moment ein NSInteger ist. "Converting" zu einem int wird dieses Problem nicht lösen. –

Antwort

179

Ta da:

NSInteger myInteger = 42; 
int myInt = (int) myInteger; 

NSInteger ist nichts anderes als ein 32/64 Bit int. (Es wird die passende Größe basierend auf dem Betriebssystem/der Plattform verwenden, die Sie ausführen)

+11

Um genau zu sein, denke ich, NSInteger ist ein Int auf 32-Bit-Plattformen und eine lange auf 64-Bit-Plattformen. –

+4

Ich bekomme eine Warnung mit dem vorgeschlagenen "casting": Implizite Konvertierung verliert Ganzzahl-Genauigkeit: 'NSUInteger' (aka 'unsigned long') zu 'int' – djcj

+0

@ djcj, ja, Antwort ist nicht korrekt für neue SDKs. Ich denke. – NAZIK

17

Ich bin mir nicht sicher über die Umstände, in denen Sie eine NSInteger in eine int konvertieren müssen.

NSInteger ist nur ein typedef:

NSInteger verwendet, um eine ganze Zahl, unabhängig von zu beschreiben, ob Sie ein 32-Bit bauen oder einem 64-Bit-System.

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
#else 
typedef int NSInteger; 
#endif 

können Sie verwenden NSInteger an jedem Ort Sie ein int verwenden, ohne sie zu konvertieren.

+2

Hier ist ein guter Grund, einen NSUinteger in einen int: Wertvergleich zu konvertieren. (int i = -1)> (NSUinteger j = 14) konvertiert das int in unsigned, was -1> 14 bedeutet, was nicht das ist, was Sie wollen. –

+1

@SamuelClay. Ein guter Punkt, wenn in bestimmten Fällen verwendet wird. Persönlich würde ich einen NSUInteger in einen UINT umwandeln. Jedoch. In der Frage ging es darum, NSInteger und nicht NSUInteger zu konvertieren. – Abizern

+0

Ich habe nur einen unsigned int verwendet, um eine allgemeine Falle zu illustrieren. Es ist der gleiche Typ für beide, wie meine Antwort zeigt.Es ist kein schwieriges Problem, aber es ist üblich genug, und ich habe noch niemanden gesehen, der eine einzeilige Antwort empfiehlt. –

28

Wenn Sie das Inline tun wollen, werfen Sie einfach die NSUInteger oder NSInteger zu einem int:

int i = -1; 
NSUInteger row = 100; 
i > row // true, since the signed int is implicitly converted to an unsigned int 
i > (int)row // false 
+1

Aus reiner Neugier, warum posten Sie zwei Jahre später eine Antwort auf eine Frage, die bereits eine angenommene Antwort mit zweistelligen Stimmen hat? Vor allem, weil deine Antwort nur eine Umformulierung ist. –

+6

Da meine Antwort eine einzelne Zeile ist (mit einem Inline-Cast - der (Int)), was ich denke, was das OP möchte. Ich habe mir das selbst angeschaut und bemerkt, dass alle Antworten zu diesem Thema mehrzeilig waren. –

+2

Die akzeptierte Antwort zeigt eine implizite Konvertierung mit einer einzelnen Zeile. Die Antwort von Abizern erklärt, dass eine implizite Konvertierung stattfindet, wenn Sie versuchen, einen 'NSInteger'-Wert anstelle eines' int' zu verwenden. In keinem Fall ist es eine Multi-Line-Lösung. –

0

Häufig in UISegmentedControl verwendet, „Fehler“ angezeigt, wenn für nicht in 64-Bit anstelle von 32 Bit, einfache Art und Weise der Zusammenstellung gibt sie an eine neue Variable ist diese Tipps zu verwenden, fügen sie (int):

[_monChiffre setUnite:(int)[_valUnites selectedSegmentIndex]]; 

statt:

[_monChiffre setUnite:[_valUnites selectedSegmentIndex]]; 
Verwandte Themen