Question

struct
{
int integer;
float real;
}
first_structure;

Nous pouvons donc nous référer à un membre du premier_structure en écrivant

first_structure.integer = 7

Si j'écris:

    struct two_numbers
    {
    int integer;
    float real;
    }
    first_structure;

Ensuite, je peux utiliser la balise * Two_numbers * pour créer une deuxième structure comme ceci:

struct two_numbers second_structure;

Je comprends également que Typedef peut être utilisé pour créer des synonymes.

Mais je ne peux pas comprendre le code ci-dessous (à partir de la page http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/ocobjectsclasses.html):

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;

Chaque objet a donc une variable ISA qui lui dit de quelle classe il est une instance.

Comment peut-il dire ???? Veuillez me guider à travers le sens de ce code.

Merci.

Était-ce utile?

La solution

C'est un raccourci vers:

struct objc_object
{
    Class isa;
};
typedef struct objc_object * id

La id le type est un pointeur vers un objc_object structure. Donc, lorsque vous utilisez un id type, vous utiliserez le -> opérateur au lieu de ., car c'est un pointeur.

Notez que le Class Le type est également un pointeur vers une structure. C'est ce qu'on appelle un type opaque.

Cela signifie essentiellement que le compilateur sera en mesure de calculer la taille, car nous n'avons qu'un pointeur, mais il ne connaîtra pas les détails de l'implémentation.

Ce type de modèle est utilisé pour masquer la mise en œuvre réelle d'une structure. Le type est défini dans un fichier d'en-tête, mais l'implémentation n'est définie que dans un fichier source.

Par exemple, dans un fichier d'en-tête:

typedef struct A_Struct * A;

C'est valable, et il définit un type d'un pointeur de structure, même si cette structure n'est pas connue en fait.

Puis dans un fichier source:

struct A
{
    int x;
    int y;
};

Voici la véritable implémentation. Les utilisateurs pourront créer A objets tapés, mais ne pourra pas accéder aux membres, car ils ne sont connus que dans votre fichier source. Les utilisateurs vous passeront A objets dactylographiés, mais vous les serez jetés à un struct A, afin que vous puissiez accéder aux membres informatiques.

C'EST À DIRE:

void foo( A someObject )
{
    struct A * a;

    a    = ( struct A * )someObject;
    a->x = 42;
}

Autres conseils

Vous pouvez le dire car lorsqu'un objet est instancié, le Durée Définit le pointeur ISA pour refléter le nom de la classe. Semblable à la façon dont un "sélecteur" dans Objective-C peut être utilisé - si vous n'êtes pas familier, un sélecteur est essentiellement le nom d'une méthode. Dans les coulisses, ce n'est qu'un nsstring, mais il n'est pas nécessaire de l'être (une implémentation alternative Le cocotron utilise une énumération de type entier je crois).

Fondamentalement, le runtime est capable de savoir quel objet est créé et peut donc définir le pointeur ISA. Et l'introspection peut fonctionner parce que si vous comparez ce que l'objet est contre une «classe», vous comparez probablement NSStrings en coulisses.

J'espère que cela répond à votre préoccupation, sinon je peux aider à clarifier

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top