2010-06-13 6 views
22

J'ai une ligne de code qui va fonctionner différemment selon les types de données "jour" et "1". Je crois que c'est le suivant même si je vais vérifier mon code source plus tard.int vs NSNumber vs NSInteger

day = day + 1;

Est-ce que ce sens? Quelles seraient les différences?

Répondre

42

NSInteger est une définition de type qui décrit un entier - mais elle n'est PAS équivalente à int sur les plates-formes 64 bits.
Vous pouvez examiner le typedef en cliquant cmd sur NSInteger dans Xcode.
NSInteger est défini comme int lors de la création d'une application 32 bits et long pour les applications 64 bits.
La plupart du temps, vous pouvez remplacer int avec NSInteger, mais il y a certaines choses à considérer.
Apple's 64-Bit Transition Guide for Cocoa a quelques informations à ce sujet.

NSNumber est une classe qui vous aide à stocker des types numériques en tant qu'objet. Il a des méthodes pour convertir entre différents types et méthodes pour récupérer une représentation sous forme de chaîne de votre valeur numérique.
Si vous utilisez une variable day de type NSNumber* comme vous l'avez fait dans votre exemple, vous ne modifiez pas la valeur de day mais son adresse mémoire.

Si vous travaillez avec des valeurs de temps, vous pouvez également jeter un oeil à NSDate.

+1

Intéressant ... semble être un point important ... – Moshe

2

1 est un littéral et le compilateur en fera le type numérique approprié si cela est approprié.

Notez, cependant que tandis que NSInteger et int sont dans la plupart des buts et la même chose, NSNumber est un type d'objet. Dans ce cas, votre code n'a pas de sens (et ne devrait pas compiler sans avertissements).

(En fait, il y a des circonstances où il serait une sorte de sens, en termes d'arithmétique des pointeurs, mais c'est tout à fait pas ce que vous voulez.)

Pour le cas NSNumber, vous auriez plutôt voulez quelque chose comme:

day = [NSNumber numberWithInt:[day intValue] + 1]; 
2

NSInteger et int sont équivalentes, NSNumber est un objet utilisé pour stocker des types de nombres primitifs (int, long, float, etc.).

L'exemple de code que vous avez posté fonctionnera très bien si day est un NSinteger, il ne fonctionnera pas du tout s'il s'agit d'un NSNumber.

+2

NSInteger et int ne sont pas équivalents pour les applications 64 bits. (NSInteger est défini comme long pour les applications 64 bits). L'exemple de code affiché fonctionnera également si day est une instance de NSNumber mais l'incrément ne changera pas la valeur mais l'adresse du destinataire. Ce n'est probablement pas ce que veut le PO. –

+0

Pour NSObject, le compilateur ne vous permettra pas de faire de l'arithmétique de pointeur. – gnasher729

8

NSInteger est un nombre entier simple, NSNumber est un objet alors que int est un type de données primitive. NSInteger n'est rien de plus qu'un synonyme d'un nombre entier long.

Si vous avez besoin de stocker un numéro quelque part, utilisez NSNumber.Si vous faites des calculs, des boucles, etc., utilisez NSInteger, NSUInteger ou int.

Vous pouvez envelopper un NSInteger dans un NSNumber en utilisant:

NSNumber *NumberToStore = @(21); 

et récupérerez en utilisant:

NSInteger retrievingInteger = [NumberToStore integerValue]; 
+0

NSNombre si vous devez stocker un nombre _en tant qu'objet_. Par exemple dans un NSDictionary ou un NSArray ou un NSSet. – gnasher729