2010-12-20 20 views
13

He visto este operador aparecer varias veces en el código de ejemplo en "Aprender el objetivo C en la Mac".¿Qué es "->" en el Objetivo C?

Creo que es un operador en el lenguaje C que el objetivo C hereda. Probé Google y buscando Stack Overflow y curiosamente no salió nada.

¿Tiene un nombre en inglés?

Respuesta

10

Tiene que ver con las estructuras.

Cuando tenemos una estructura disponible localmente en la pila, accedemos a sus miembros con el operador .. Por ejemplo:

CGPoint p = CGPointMake(42,42); 
NSLog(@"%f", p.x); 

Sin embargo, si en lugar tenemos un punteroa una estructura, tenemos que utilizar el -> operador:

CGPoint *p = malloc(1*sizeof(CGPoint)); 
p->x = 42.0f; 
NSLog(@"%f", p->x); 
free(p); 
+4

No es necesario, podemos usar '(* p) .x' en su lugar. – jer

+1

@jer sure, pero soy de la opinión de que 'p-> x' es mucho más simple de leer que' (* p) .x'. –

5

Es una selección de miembros (o acceso) equivalente a un puntero de referencia (como se señala en los comentarios)

a->member es equivalente a (*a).member en C/C++

+0

Como corolario de lo anterior, es lo mismo que en C. – jer

+0

Creo que el voto a favor se debe a que dijiste que es una des-referencia del puntero, mientras que en realidad el operador de referencia del puntero es el '' ' ; el estándar C99 lo llama "operador de acceso miembro" como el punto ('.') (§6.6.9). Solo diría que es una abreviatura para la notación '(* a) .Member'. –

+0

+1 porque es correcto. –

10

-> es no específica a C objetivo. Es un operador C.

Ahora que está despejado, es el operador de acceso de miembro, equivalente a una referencia de puntero y luego usa el operador de punto en el resultado.

Supongamos que tenía un struct así:

typedef struct Person { 
    char *name; 
} Person; 

Person *jacob = malloc(1*sizeof(Person)); 

Así que esta declaración:

jacob->name = "Jacob"; 

es equivalente a esta declaración:

(*jacob).name = "Jacob"; 

Por supuesto, no se olvide el free:

free(jacob); 
+0

Cuando dice que es equivalente a *, no es realmente. Es equivalente a eliminar referencias y luego a usar. –

+0

@Mitch, No, realmente quise decir eso. –

+0

Quizás crees una estructura Person y la asignes, para una corrección completa. –

2

a->b es equivalente a (*a).b, y designa miembro de b de el objeto apuntado por a.

En el estándar C, se llama el "operador de puntero de estructura/unión", que no es realmente el nombre más pegadizo.

9

En C

a->b 

es un atajo para

(*a).b 

que es para eliminación de referencias de los miembros de una estructura que es apuntado.

Esto es útil, debido a. se une más fuerte que el operador de desreferenciación *. Entonces al usar -> evitas tener que usar estos feos paréntesis.

2

Es el "operador de acceso de miembro indirecto". Es un operador C, que tanto Objective-C como C++ heredaron.

Este

a->b 

es equivalente a:

(*a).b 

pero es menos escribir. (Los parens son necesarios en la forma expandida debido a la precedencia de * y ..)

2

Todo ha sido dicho, se trata de un acceso directo para acceder a los miembros de un puntero estructura, pero sólo una nota para añadir que se puede acceder Ivars utilizando la misma sintaxis debido a la forma en que funciona el tiempo de ejecución de Objective-C:

@interface Foo : NSObject { 
    NSString *something; 
} 

/* ... SNIP ... */ 

NSLog(@"something = %@", foo->something); // Where foo is an instance of the Foo class 

Esto es útil cuando se necesita acceder a ivars que no se exponen por métodos; específicamente cuando necesite implementar copyWithZone: en sus objetos.

+0

eso está bien, pero ¿puedes decirme qué significa esto? loginViewController-> mPortSIPSDK = mPortSIPSDK; primero mportSIPSDK es una instancia de PORTSIPSDK que se declara en loginviewcontroller.Segundo es decir, (= mPortSIPSDK) se declara en aoodelegate. –

4

The same thing that it means in C. Se puede usar para acceder directamente a las variables de instancia de los objetos, pero generalmente esta no es la mejor práctica. La notación de punto a la que se refiere es property, no la notación de punto C habitual.

+2

Puede ser interesante observar que 'self-> bla' (o simple' bla') accede al ivar directamente, mientras que 'self.bla' accede a él a través de los descriptores de acceso a la propiedad. –

+0

Sí, eso está algo implicado en mi respuesta. En particular, no puede usar 'self.bla' para acceder a una variable de instancia porque' self' es un puntero al objeto en la memoria. Es por eso que tienes que usar '->'. Y es por eso que no hay conflicto entre la notación C dot y las propiedades Obj-C :) – jtbandes

+0

jtbandes: Exactamente. –