2010-12-15 22 views
8

Esto puede parecer una pregunta trivial.Por qué se declaran variables de objeto con una estrella

Pero ¿por qué es que tenemos que utilizar el símbolo de asterisco al declarar las variables de objeto

gusta, hacemos

Car * mazda = [[Car alloc] init]; 

¿Cuál es la importancia del asterisco, quiero decir que el compilador ya se sabe que es un objeto Estoy seguro de que se puede entrenar al compilador para que no se queje. Pero, de nuevo, al omitirlo, recibo un mensaje de error "asignando estáticamente instancia de objetivo-c clase NSObject" ¿Para qué sirve eso?

+0

posible duplicado de [Why \ [object doSomething \] and not \ [* object doSomething \]?] (Http://stackoverflow.com/questions/2189212/why-object-dosomething-and-not-object- dosomething) – bbum

Respuesta

10

El asterix es un calificador de la variable del coche que usted declara. Significa que estás declarando un puntero a un auto en lugar de declarar un auto en sí mismo. El valor de retorno de la función init (y la función alloc para ese asunto) es un puntero a un automóvil, no un automóvil en sí mismo, por lo tanto, esto es correcto.

+0

Gracias, eso tiene mucho sentido. Entonces, el asterisco es obligatorio en cada escenario correcto. O lo que estoy preguntando es en qué escenarios no utilizamos el asterisco. – stone

+2

Cuando estás hablando de un "Coche" real (o de cualquier clase con la que estés lidiando), no necesitas un '*'. Cuando se refiere a un ** puntero ** a un 'Coche '(como en este caso), lo hace. –

+0

No hay escenarios donde no use el asterisco para objetos en Objective-C. En este sentido, no es necesario. Sin embargo, todos los demás tipos de punteros en C y, por lo tanto, en Objective-C utilizan el asterisco - int * foo, por ejemplo, por lo que está ahí para garantizar la coherencia. –

4

Objective-C requiere que todos los objetos estén dinámicamente asignados (es decir, en el montón). El error que recibes indica que estás tratando de crear un objeto Car en la pila. Al declarar mazda como un puntero a Car (Car *) en lugar de a Car, usted satisface ese requisito.

+0

Gracias, ¿En qué caso no uso el asterisco? – stone

+3

Si la variable en cuestión es un objeto Objective C, siempre usará la estrella. Si la variable es C-struct o primitiva (NSInteger, CGRect, CGFloat, int, etc.), no necesita usar la estrella, porque C está bien para crear objetos en la pila. –

6

Con * declaras un puntero. Eso es como en C, que es un subconjunto de ObjC. Sin el *, la variable se asignaría estáticamente, lo que no es posible para los objetos ObjC (porque el tamaño del objeto no podría determinarse en tiempo de compilación).

variables de estáticamente asignados se utilizan para los tipos C primitivos como int o doble

int number = 42; 
0

El asterisco en declaración de variable también significa que el valor de la variable no tendrá un valor asignado estático. Es un puntero al igual que los otros han dicho.

Cuestiones relacionadas