2010-12-05 5 views

Répondre

39

Dans une sorte de symétrie avec votre earlier question, NSNumber est un type d'objet. Vous devez créer via une invocation de méthode telle que:

[p setAge:[NSNumber numberWithInt:10]]; 

Votre code actuel tente simplement de jeter l'entier arbitraire 10 à un pointeur . Ne faites jamais: si le compilateur ne vous a pas averti à ce sujet, vous essayez alors d'accéder à des octets complètement inappropriés à l'emplacement mémoire 10 comme s'ils étaient un objet NSNumber, ce qui ne serait pas le cas. Faire ce genre de choses conduit à des larmes.

Oh, et juste pour préempter les prochains problèmes évidents, rappelez-vous que si vous souhaitez utiliser la valeur dans un objet NSNumber, vous devez obtenir à ce via des appels de méthode aussi, par exemple:

if ([[p age] intValue] < 18) 
    ... 

(NSNumber est immuable, et je pense il est mis en œuvre de telle sorte que des valeurs identiques sont mis en correspondance avec le même objet. il est donc probablement possible de sortir avec des comparaisons de pointeur direct pour la valeur d'égalité entre NSNumber objets. Mais s'il vous plaît ne pas, parce que ce serait une dépendance inappropriée à un détail de mise en œuvre. Utilisez isEqual à la place)

+1

Merci d'avoir anticipé le prochain numéro :) –

+0

Seul un sous-ensemble de valeurs NSNumber possibles est mis en cache en tant que singletons, le reste étant des instances individuelles. L'ensemble exact de ce qui est mis en cache a changé avec le temps (et changera probablement dans le futur). +1 pour souligner l'utilisation de 'isEqual:'. – bbum

6

Utilisez ceci:

[p setAge:[NSNumber numberWithInt:10]]; 

Vous ne pouvez pas convertir un entier comme 10 en NSNumber* (pointeur vers NSNumber).

+0

grâce peut vous dire aussi pourquoi depuis la coulée est censé fonctionner comme dans c que je peux lire ici http://stackoverflow.com/questions/690748/how-to-cast-an-object-in-objective-c –

+0

Peut accepter la réponse seulement dans 10 minutes stackoverflow dit :) –

4

Parce que NSNumber est un objet et "10" dans un type entier primitif, tout comme la différence entre int et Integer en Java. Vous, donc, besoin d'appeler son initialiseur:

[p setAge:[NSNumber numberWithInt:10] 
4
NSNumber *yourNumber = [NSNumber numberWithInt:your_int_variable]; 
22

Aujourd'hui, il est également possible de le faire en utilisant la notation abrégée:.

[p setAge:@(10)]; 
+5

Vous pouvez également supprimer les parenthèses si vous n'utilisez que 10. Ie @ 10. Vous n'avez besoin des parenthèses que si vous utilisez un nom de variable ou une somme, etc ... – Fogmeister