2012-05-07 32 views
13

No pude encontrar esto en ningún lado, así que solo estoy preguntando para estar seguro. Y sí, sé que es básico, pero creo que prefiero hacerlo bien antes de cometer el error un millón de veces:Agregar enteros a NSMutableArray

Si hago lo siguiente, ¿convierte el "0" a un NSNumber de forma predeterminada (si no, ¿qué tipo de objeto es), o tendría que hacer el segundo código?

(O ambos podrían ser incorrectos para lo que estoy intentando hacer. Si es así, avíseme. Ambos compilan así que me pregunto cuál es "correcto" (o preferido) y por qué).

Código 1:

NSMutableArray array = [[[NSMutableArray alloc] init]]; 
[array addObject: 0]; 

Código 2:

NSMutableArray array = [[NSMutableArray alloc] init]; 
[array addObject: [NSNumber numberWithInt: 0]]; 

Respuesta

21

NSMutableArrayno toma tipos primitivos.

La segunda opción es correcta.

+0

fresca bien. ¡¡Gracias!! Voy a marcar esto como la respuesta correcta pronto (dice que tengo que esperar 10 minutos para aceptar una respuesta a esta pregunta) – MrHappyAsthma

+1

Estoy feliz de haber podido ayudar. –

6

No puede poner una primitiva como int en NSArray; debe construir una instancia NSNumber para mantenerlo.

Si hago lo siguiente, ¿se emitió el "0" a un NSNumber por defecto (si no es así, qué tipo de objeto es)

No colada se lleva a cabo. No es posible simplemente "fundir" una primitiva en un objeto, y la primitiva no tiene un tipo de objeto. Los objetos se deben construir mediante el envío de mensajes (excepto: ver a continuación), que ocurre en el tiempo de ejecución; el lanzamiento solo tiene un efecto durante la compilación.

La única razón por la que esto funciona es porque ha elegido 0 para agregar a la matriz. Este es el mismo valor que nil, que significa "sin objeto". Si hubiera elegido cualquier otro número entero, tendría un bloqueo en sus manos cuando ejecutara el código, ya que el valor se usaría como un puntero a la memoria que no contiene un objeto válido.

Curiosamente, sin embargo, comenzando con Clang 3.1 o LLVM 4.0 de Apple, * hay some new syntatical sugar para crear objetos a partir de literales en el código. Siempre hemos tenido literal NSStrings: @"Lichtenstein". Con el nuevo compilador, también se pueden crear otros objetos utilizando el carácter @.

En este caso, para crear un objeto NSNumber de un literal entero, simplemente hay que escribir:

[array addObject:@0]; 

* (todavía no está disponible en Xcode pública)

0

Como se dijo según las respuestas anteriores, solo puede agregar objetos (tipo id) a clases de contenedor como NSArray.

Una clase que puede ser útil en este contexto es NSValue, que sirve como un contenedor para tipos de datos no objeto de C y objetivo-C.Además de los tipos de datos numéricos, esto también puede contener estructuras y algunos tipos de datos primitivos de Object C como NSRect.

Mire aquí para más detalles: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsvalue_Class/Reference/Reference.html

Cuestiones relacionadas