39 votes

La différence entre l'auto.ivar et ivar?

classe.h

@interface aClass : NSObject {
    NSString *name;
}

@property (nonatomic, retain) IBOutlet NSString *name;

@end

classe.m

@implementation aClass

@synthesize name;

- (void)dealloc {
    [name release];
    [super dealloc];    
}

- (void)test1 {
    name = @"hello";
}

- (void)test2 {
    self.name = @"hello";
}

Prendre ci-dessus à titre d'exemple. Quelqu'un pourrait-il expliquer la différence entre name = @"hello" et self.name = @"hello"? Merci!

EDIT: question subsidiaire: Comment écrire ma propre définition pour une ivar, c'est à dire: l'auto.ivar = ... ?

64voto

Joe Blow Points 3618

ÊTRE CONSCIENT DU FAIT QUE CE POST EST VIEUX !

Ce poste est à partir de la décennie précédente.

Assurez-vous de lire l'importante note de bas de page vers le bas ci-dessous, merci!!


Il est vraiment difficile de comprendre tout cela, lorsque vous êtes juste de commencer.

Voici quelques SIMPLES, PRATIQUES et règles de base POUR les DÉBUTANTS.

Pour répéter, ce post est POUR les DÉBUTANTS.

Le but ici est de vous permettre de rapidement passer de la ligne de départ, pour être en mesure d'utiliser en toute confiance au système dans la plupart des situations.

Plus tard, vous pouvez en apprendre beaucoup sur le fonctionnement interne de ces questions.

(1) Ne jamais dire name=@"hello". Toujours dire self.name=@"hello". Faire un projet de recherche à l'échelle pour name et de vous assurer de toujours dire self.name et pas name, lorsque vous définissez ou de le modifier.

(2) Vous savez tous que de provoquer la colère des choses à propos de la gestion de la mémoire, de l'initialisation, de la libération et ainsi de suite. Si vous utilisez l'auto truc, il prend soin de tout cela pour vous. Cool hein?

(3) L'auto thingy est particulièrement utile parce que vous pouvez facilement "" changer de chaîne (ou quoi que ce soit) comme vous allez le long. Donc, il est tout à fait OK pour ce faire,

self.name=@"aa";  
self.name=@"bb";  
self.name=@"cc";  

alors que (en un mot) , vous ne pouvez jamais, jamais, pour une raison quelconque, cela...

name=@"aa";
name=@"bb";
name=@"cc";

( * ) Quant à votre question littérale, "s'il vous plaît expliquer la différence entre name = @"hello" et self.name = @"hello"?" C'est facile à faire.

Le premier est juste la définition d'une variable. Vous savez, exactement comme "x=42" dans l'ancien des jours où la vie était simple et nous avons été de 13 ans.

Le second est complètement différent, plus précisément c'est d'appeler un complexe de routine (connu comme le "setter") pour en faire un ensemble beaucoup de incroyable et étonnante choses pour vous.

Donc, c'est la traduction littérale de réponse à votre question. Le premier juste définit la variable (et n'oubliez pas, il y a tout un tas de pointeurs et d'autres trucs bizarres impliqués, et en règle générale, vous certainement ne peut pas juste mettre des pointeurs de bon gré mal gré comme ça). Le second appelle effectivement un gros complexe de routine et donc n'a tout un tas de choses pour vous.

Encore une fois, la deuxième est exactement comme dire...

[name bigComplicatedRoutineHere:@"hello"];

...il est très utile de se rappeler que la syntaxe self. ... est littéralement l'appel d'une routine.

En effet, certains penseurs sur le sujet pensé que c'était une idée stupide quand ils ont introduit cette self.X de la syntaxe pour signifier [X complicatedThingHere]. Il introudces beaucoup de confusion, et tous les débutants se demande exactement ce que vous demandez.

Personnellement, il m'a fallu plus de neuf ans pour obtenir ce clair dans ma tête. :-) Encore une fois, je tiens à souligner que vous devez vous rappeler que quand vous dites self.x, en fait, vous êtes réellement l'appel d'une routine.

À répéter: "l'auto-point" de la syntaxe en fait des appels de routine. (En effet, je crois que l'une des préprocesseurs simplement l'étend à l' [x amazingStuffHere]. )

J'ai essayé de répondre d'une manière qui va vous tenir en haleine et vous permettre d'avancer et d'utiliser plus de fonctionnalités, tandis que vous apprenez à propos de la gestion de la mémoire, des propriétés, et ainsi de suite. Si vous êtes plus avancé que ce post, juste l'ignorer.

Veuillez noter que ce poste est destiné à des conseils pour les débutants afin de leur permettre de continuer et de ne pas obtenir furieux. Espérons que cela aide!


2014 mise à jour! Remarque importante sur l'ARC pour les débutants ...

Remarque, ce post est de cinq ans maintenant! Il a été lu par des milliers de débutants et j'ai reçu beaucoup d'e-mail, etc avec suivi des questions etc. Veuillez noter que, aujourd'hui, dans la nouvelle "l'ARC du monde". Dans une certaine mesure: si vous êtes un débutant: vous devriez assez bien la seule utilisation!! les propriétés. c'est à dire, utiliser "l'auto.que ce soit" à tout moment, partout. Dans tous les cas, il faut simplement être conscient que les informations de ce post est "en grande partie" historique et devient de plus en plus chaque jour. Bien sûr, il va sans dire qu'une fois que vous êtes un expert, vous aurez besoin de et de comprendre tous les détails subtils de tout cela. Espérons que cela aide quelqu'un.

32voto

JustSid Points 16366

self.name utilise l'accesseur et/ou mutateur que vous avez défini (c'est nonatomic et de conserver dans votre cas). Ainsi, lorsque vous appelez self.name = foo, il va appeler l' setName:(NSString *)str mutateur généré par le compilateur, qui va d'abord la libération de l'actuelle chaîne de caractères, puis conserve la nouvelle chaîne et, enfin, définit le nom de la retenue de la chaîne.

Juste appelant name = foo ne fait rien de plus que d'attribuer un nom à toto.

Cela signifie également que vous pouvez uniquement appeler self.xxx lorsque vous avez défini une propriété pour le ivar, sinon le compilateur va vous dire qu'il ne sait pas parler(iVar).

6voto

cfisher Points 4915

nom = @"Joe"

Vous avez accès directement à la variable, en contournant la méthode de lecture que le Cacao a pris la peine de créer pour vous. Généralement, pas la meilleure chose à faire.

auto.nom = @"Joe"

Maintenant vous allez par le biais de la méthode que vous avez demandé de cacao à créer pour vous. Ce est généralement la meilleure façon.

En règle générale, utilisez toujours le setter et getter fournis par le Cacao, avec UNE exception: dans le dealloc. Dans le dealloc, vous devriez toujours libérer de la variable directement, pas par le biais de la méthode de lecture:

-(void) dealloc {
   [name release]; // instead of [[self name] release]
   ...

   [super dealloc];
}

La raison d'éviter les accesseurs dans le dealloc est que si il y a des observateurs ou d'une substitution dans une sous-classe qui déclenche le comportement, ça va être déclenchée à partir de dealloc qui est à peu près jamais ce que vous voulez (à cause de l'état de l'objet sera incompatible).

Otoh, que, il y a aussi un peu plus de pratique de la syntaxe pour déclarer iVars que vous pourriez ne pas être conscient de. Si vous ne cible que les 64 bits de mac, Vous pouvez utiliser les propriétés de générer à la fois des méthodes accesseurs et la variable d'instance de lui-même:

#import <Cocoa/Cocoa.h>
@interface Photo : NSObject 
@property (retain) NSString* caption; 
@property (retain) NSString* photographer; 
@end

-2voto

Lee Points 1

C'est réel, une gestion de la mémoire, la première la propriété de la grammaire est vrai setter et getter méthode, lors de l'utilisation de l'auto.xxx = ?, il pourrait appeler la méthode de définition, l'objet de conserver cout +1, le nom ne peut pas être communiqué, toutefois, si nom = toto n'est rien au sujet de la propriété de la grammaire.

méthode de définition exemple:

-(void)setObj:(ClassX*) value 
{  
         if (obj != value) 
         { 
                   [obj release]; 
                   obj = [value retain]; 
         } 
} 

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