41 votes

Que signifie isa dans objective-c ?

Je voudrais connaître la signification des lignes écrites ci-dessous avec un exemple. Je ne parviens pas à comprendre ce que ces lignes signifient réellement. Les lignes sont tirées des directives de codage objective-c de Google.

Initialisation
Ne pas initialiser les variables à 0 ou nil dans la méthode init ; c'est redondant.

Toute la mémoire d'un objet nouvellement alloué est initialisée à 0 (sauf pour isa), donc n'encombrez pas la méthode init en ré-initialisant les variables à 0 ou nil.

94voto

mipadi Points 135410

Sous le capot, les objets Objective-C sont fondamentalement des structs C. Chacun d'entre eux contient un champ appelé isa qui est un pointeur vers la classe dont l'objet est une instance (c'est ainsi que l'objet et le runtime Objective-C savent de quel type d'objet il s'agit).

Concernant l'initialisation des variables : en Objective-C, les variables d'instance sont automatiquement initialisées à 0 (pour les types C comme int ) ou nil (pour les objets Objective-C). Les directives d'Apple stipulent que l'initialisation de vos ivars à ces valeurs dans vos objets Objective-C doit se faire dans le respect des règles de l'art. init est redondant, alors ne le faites pas. Par exemple, disons que vous avez une classe comme celle-ci :

@interface MyClass : NSObject
{
    int myInt;
    double myDouble;
    MyOtherClass *myObj;
}
@end

Rédiger votre init de cette manière serait redondant, puisque ces ivars seront initialisés à la valeur 0 o nil de toute façon :

@implementation MyClass

- (id)init
{
    if ((self = [super init])) {
        myInt = 0;
        myDouble = 0.0;
        myObj = nil;
    }
    return self;
}

@end

Vous pouvez faire ceci à la place :

@implementation MyClass

- (id)init
{
    return [super init];
}

@end

Bien sûr, si vous voulez que les ivars soient initialisés à des valeurs autres que 0 o nil vous devez quand même les initialiser :

@implementation MyClass

- (id)init
{
    if ((self = [super init])) {
        myInit = 10;
        myDouble = 100.0;
        myObj = [[MyOtherClass alloc] init];
    }
    return self;
}

@end

32voto

dreamlax Points 47152

Lorsque les objets sont alloués par le runtime Objective-C, toute la mémoire où résident les variables d'instance est mise à zéro pour vous, il n'est donc pas nécessaire de mettre les variables d'instance à 0 ou nil . Vous pouvez les régler sur la valeur de votre choix. Certains développeurs ignorent même la redondance et définissent les variables d'instance à 0 de toute façon, juste pour des raisons d'explicitation ou de description.

isa signifie "est un". Chaque objet Objective-C (y compris chaque classe) possède une fonction isa pointeur. Le runtime suit ce pointeur pour déterminer la classe d'un objet, afin de savoir à quels sélecteurs l'objet répond, quelle est sa super classe, quelles sont les propriétés de l'objet, etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X