2010-12-05 25 views

Respuesta

39

En una especie de simetría con su earlier question, NSNumber es un tipo de objeto. Es necesario para crearla a través de una invocación de métodos tales como:

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

su código actual está intentando simplemente a emitir el número entero arbitrario 10 a un puntero. Nunca haga esto: si el compilador no le advirtió al respecto, entonces estaría tratando de acceder a algunos bytes completamente inapropiados en la ubicación de la memoria 10 como si fueran un objeto NSNumber, que no serían. Hacer eso lleva a las lágrimas.

Ah, y sólo para adelantarse a las siguientes cuestiones obvias, recuerde que si desea utilizar el valor de un objeto NSNumber, que necesita para obtener en esa vía método llama también, por ejemplo:

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

(NSNumber es inmutable, y yo creo se implementa de tal manera que los mismos valores se asignan a un mismo objeto. Así que es probable que sea posible de salirse con comparaciones directas puntero para la igualdad de valor entre NSNumber objetos. Pero por favor, no , porque eso sería una dependencia inapropiada de un detalle de implementación. Utilice isEqual lugar)

+1

Gracias por anticipar el próximo número :) –

+0

Solo un subconjunto de posibles valores NSNumber se almacena en caché como singletons, el resto son instancias individuales. El conjunto exacto de lo que se almacena en caché ha cambiado a lo largo del tiempo (y es probable que cambie en el futuro). +1 para enfatizar el uso de 'isEqual:'. – bbum

6

Utilice esta:

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

No se puede convertir un literal entero como 10 en un NSNumber* (puntero a NSNumber).

+0

gracias pueden también explicar por qué desde la fundición se supone que funciona como en C que puedo leer aquí http://stackoverflow.com/questions/690748/how-to-cast-an-object-in-objective-c –

+0

Puede aceptar la respuesta solo en 10 minutos Stackoverflow dice :) –

4

Porque NSNumber es un objeto y "10" en un tipo de entero primitivo, muy parecido a la diferencia entre int e Integer en Java. Usted, por lo tanto, necesita llamar a su initialiser:

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

Hoy en día también es posible hacerlo utilizando notación abreviada:.

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

También puede soltar los paréntesis si solo está usando 10. Ie @ 10. Solo necesita los paréntesis si usa un nombre de variable o suma, etc. – Fogmeister