objective-c cocoa pointers integer nsinteger

objective c - ¿Por qué no declaro NSInteger con un*



objective-c cocoa (4)

El * significa "puntero". La variable objeto contiene un puntero a un objeto, por lo que tiene un * ; la variable NSInteger contiene un NSInteger, no un puntero a un NSInteger, por lo que no tiene un * . Poner * en esa variable te da al menos una advertencia porque estás poniendo un entero en una variable de puntero.

Estoy probando el curso de iPhone de Stanford en iTunes U y estoy un poco confundido con los punteros. En la primera tarea, intenté hacer algo como esto

NSString *processName = [[NSProcessInfo processInfo] processName]; NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

Lo cual generó un error, después de probar a ciegas, descubrí que era el * en la línea NSInteger que causaba el problema.

Entonces, obviamente, no entiendo lo que está pasando. Explicaré cómo creo que funciona y tal vez alguien tenga la amabilidad de señalar el error.

A diferencia del desarrollo web, ahora tengo que preocuparme por la memoria, bueno, más que en el desarrollo web. Entonces cuando creo una variable, se asigna un poco de memoria en algún lugar (RAM, supongo). En lugar de pasar la variable, paso un puntero a ese pedazo de memoria. Y los punteros se declaran prefijando el nombre de la variable con *.

Asumiendo que estoy en lo cierto, lo que me desconcierta es por qué no necesito hacer eso para NSInteger.


La razón por la que no declaras NSInteger con un * es porque no es un objeto. Un NSInteger es simplemente un int o un long :

#if __LP64__ typedef long NSInteger; #else typedef int NSInteger; endif

Si se está utilizando en una aplicación de 32 bits, es un número entero de 32 bits, y si se está creando en una aplicación de 64 bits, es un número entero de 64 bits.

Por supuesto, puede pasar un NSInteger como un puntero, pero la mayoría de las funciones simplemente toman argumentos como un NSInteger y no como un puntero a él.

Los objetos, por otro lado, solo se pueden pasar a otras funciones como punteros. Esto se debe a que los objetos tienen memoria asignada dinámicamente para ellos, por lo que no pueden declararse en la pila. Como una int o long tiene asignada una cantidad fija de memoria, esto no es un problema.


NSInteger es solo un typedef para int, AFAIK.


NSInteger es un tipo primitivo, lo que significa que se puede almacenar localmente en la pila . No necesita usar un puntero para acceder, pero puede hacerlo si lo desea. La línea:

NSInteger *processID = [[NSProcessInfo processInfo] processIdentifier];

devuelve una variable real, no su dirección. Para solucionar esto, debes eliminar el * :

NSInteger processID = [[NSProcessInfo processInfo] processIdentifier];

Puede tener un puntero a un NSInteger si realmente quiere uno:

NSInteger *pointerToProcessID = &processID;

El ampersand es la dirección del operador. Establece el puntero al NSInteger igual a la dirección de la variable en la memoria, en lugar de al número entero en la variable.