Punto («.») operador y la flecha»->») el uso del operador en C frente a Objective-C

Estoy tratando de envolver mi cabeza alrededor de algunas de las diferencias en el uso y la sintaxis en C frente a Objective-C. En particular, quiero saber cómo (y por qué) el uso es diferente para el operador y el operador flecha en C frente a Objective-C. he Aquí un ejemplo sencillo.

C Código:

//declare a pointer to a Fraction
struct Fraction *frac;

...

//reference an 'instance' variable
int n = (*frac).numerator;     //these two expressions
int n = frac->numerator;       //are equivalent

Código Objective-C:

//declare a pointer to a Fraction
Fraction *frac = [[Fraction alloc] init];

...

//reference an instance variable
int n = frac.numerator;        //why isn't this (*frac).numerator or frac->numerator??

Por lo tanto, ver cómo frac es el mismo en ambos programas (es decir, que es un puntero a una Fracción de objeto o estructura), ¿por qué hay que utilizar una sintaxis diferente al acceder a las propiedades? En particular, en C, la numerator propiedad se accede con frac->numerator, pero con Objective-C, que se accede mediante el operador punto, con frac.numerator. Desde frac es un puntero en ambos programas, ¿por qué son estas expresiones diferentes? Alguien puede ayudar a aclarar esto para mí?

InformationsquelleAutor Charles | 2012-01-31

5 Kommentare

  1. 78

    frac en realidad no es la misma en ambos programas.

    Un C Fraction es un struct, que es un tipo de base sin operadores sobrecargados y, realmente, sólo capaz de ser construido y destruido por defecto. Si usted definir funciones o campos en la estructura, la forma de acceder a las propiedades en C es con el punto (.) del operador. Objective-C mantiene este operador cuando se utiliza structs. Para su conveniencia, usted puede realizar una eliminación de referencias-y-punto de operación mediante la flecha (->) operador (las dos expresiones equivalentes que mencionas). Objective-C también se conserva este cuando se accede a structs.

    Un Objetivo-C Fraction en su ejemplo, sin embargo, es probablemente (uno supongo), un puntero de, al menos, el tipo de id, que es simplemente un nombre de clase y el puntero a la instancia de esa clase bajo el capó. También es muy probable que sea una subclase de NSObject o NSProxy. Estos Objective-C las clases son especiales en que se han de toda la capa de operaciones predefinidas en la parte superior de sólo un C struct (si de verdad quieres profundizar en ella, entonces usted puede tomar un vistazo a la Objetivo-Tiempo De Ejecución De C De Referencia). También es importante destacar, una clase Objective-C es siempre un puntero.

    Una de las operaciones más básicas es objc_msgSend. Cuando operamos en estos tipos de objetos, el Objetivo-C compilador interpreta un punto (.) el operador o el corchete de sintaxis ([object method]) como un objc_msgSend llamada al método. Para obtener información más detallada acerca de lo que realmente sucede aquí, ver esta serie de posts por Bill Bumgarner, un ingeniero de Apple que supervisa el desarrollo de los Obj-C en tiempo de ejecución.

    La flecha (->) el operador no es realmente supone para ser utilizado en Objective-C los objetos. Como he dicho, Objective-C instancias de la clase C struct con una capa adicional de comunicación, pero que la capa de la comunicación es esencialmente bypass cuando utilice la flecha. Por ejemplo, si se abre Xcode y el tipo de [UIApplication sharedApplication]-> y, a continuación, abrir el método de finalización de la lista, verá esto:

    Punto (

    Aquí puedes ver un montón de normal campos que por lo general el acceso con corchete de sintaxis (como [[UIApplication sharedApplication] delegate]). Estos elementos, sin embargo, son los C campos que almacenan los valores de sus respectivos Objective-C propiedades.

    Así, se puede considerar de esta manera:

    El operador de punto en un C objeto

    1. (en tiempo de ejecución) valor de Retorno del campo

    Flecha operador en una C objeto (puntero)

    1. Eliminar puntero
    2. Valor de retorno del campo

    El operador de punto/corchetes en un Objetivo-C objeto (puntero)

    1. (en tiempo de compilación) Reemplazar con llamar a objc_msgSend
    2. (en tiempo de ejecución) Buscar Obj-C de la definición de clase, lanzar la excepción, si algo salió mal
    3. Eliminar puntero
    4. Valor de retorno del campo

    Flecha operador en un Objetivo-C objeto (puntero)

    1. (en tiempo de ejecución) de Eliminar puntero
    2. Valor de retorno del campo

    Ahora definitivamente estoy simplificando aquí, pero para resumir: la flecha operadores parecen hacer básicamente lo mismo en ambos casos, pero el operador tiene un extra/significado diferente en Objective-C.

    • «El operador de punto en un C objeto (en tiempo de ejecución) Compruebe que existe el campo de» No hay tal comprobación en tiempo de ejecución se realiza. Ni la flecha operador de verificación de validez de los punteros en tiempo de ejecución.
    • Puede usted enlace a la documentación que describe exactamente lo que sucede, así que puedo editar el post en consecuencia? No tengo tiempo para hacer la investigación de mí mismo. Gracias!
    • open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf ver sección 6.5.2.3, página 84 (numeradas 72 en el PDF). Usted puede necesitar para estar familiarizado con la lectura de este tipo de documentos con el fin de comprenderlo.
  2. 9

    Dot-notación es una opción de diseño. Desde siempre nos trato con los punteros a objc de los casos, me imagino que los diseñadores querían algo familiar, lo que también podría no romper los programas existentes. Fue introducido en ObjC 2 – hace apenas unos años. Antes de eso, siempre había que utilizar los soportes para la mensajería.

    La notación de punto marca la diferencia, aunque no es de acceso directo, pero un mensaje.

    Que es:

    obj.property = val;
    //is the same as:
    [obj setProperty:val];
    //and not:
    obj->property = val;
    
    
    val = obj.property;
    //is the same as:
    val = [obj property];
    //and not:
    val = obj->property;

    Todavía puede escribir obj->ivar para acceder a un puntero a los miembros del objeto (si está visible).

  3. 6

    En el primer ejemplo, Fraction es una estructura.
    En el segundo ejemplo, Fraction es una clase Objective-C (y en iOS podría ser una subclase de NSObject).

    C++ no permite la sobrecarga de operator .. Por lo tanto, sin información adicional, se puede deducir que la notación de punto que estamos viendo es una construcción de lenguaje integrado en Objective-C, en lugar de una C/C++ o definido operador sobrecargado.

    Como es el caso, la notación de punto es simplemente una característica de diseño, los ejecutores eligió como una abreviatura para el acceso a la propiedad, completamente equivalente a la plaza soporte de captador:

    myObjCVar.prop == [myObjCVar prop];
  4. 2

    El operador de punto sobre los objetos es una sintaxis especial para acceder a los objetos de propiedades. Llama a la propiedad getter o setter detrás de las escenas. Así, por ejemplo, [@"hello" length] y @"hello".length son equivalentes*. Para todos los otros tipos, el punto es el mismo que el punto C, y la flecha es siempre la misma.

    * Nota: El método de descriptor de acceso no será siempre el mismo nombre que el de la propiedad. Si es un declarado de la propiedad y de la declaración designa un especial getter o setter método, que será usado en su lugar.

    • Nota para quien votada abajo: Si usted piensa que esta respuesta contiene información incorrecta, no está en corregirlo simplemente pulsando la flecha hacia abajo. Si bien editar la respuesta o dejar un comentario con la información correcta, que es mucho más útil. De lo contrario, voy a seguir escupiendo fuera de esta información a quien la pide, porque que yo sepa es del todo correcta.
  5. 1

    El punto y la flecha de notación son igual de la misma en C como en Objective-C (estricta superconjunto de ). Creo que la diferencia fundamental que hay que distinguir es la diferencia entre una estructura y un Objetivo-C objeto.

    La notación de punto para objetos en Objective-C se utilizan para las propiedades que se introdujo en Objective-C 2.0. Sin embargo, con las estructuras, el -> y la notación de punto entre Objective-C y C son las mismas.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea