2011-01-24 2 views
1

Je comprends qu'une version accède directement à la variable d'instance et l'autre appelle sa méthode accesseur.Pourquoi appeler "self.classVariable" lorsque vous pouvez simplement appeler "classVariable"?

If self.classVariable = sandwich; 

&

If classVariable = sandwich; 

font la même chose. Est-ce que quelqu'un peut expliquer le point de la frappe supplémentaire?

+3

duplication possible de [iPhone différent entre auto et variable normale] (http://stackoverflow.com/questions/536388/iphone-different-between-self-and-normal-variable) –

Répondre

2

En Objective-C, self.property est property accès, pas l'accès direct à la variable d'instance. C'est du sucre syntatique pour [self property] ou [self setProperty:], et a donc la sémantique d'un message. L'exécution moderne d'Objective-C peut synthétiser une variable d'instance de sauvegarde (du même nom que la propriété), mais vous pouvez sauvegarder une propriété avec une variable d'instance avec un nom différent ou pas du tout. En d'autres termes,

self.property = foo; 
id bar = property 

et

property = foo; 
id bar = property; 

ne sont pas du tout la même chose. C'est généralement une mauvaise idée de mélanger l'accès direct et l'accès aux propriétés (à l'exception du fait que vous devriez accéder aux ivars directement dans les méthodes -init et -dealloc) car vous risquez de vous heurter aux règles de gestion de la mémoire.

0

La saisie supplémentaire consiste à protéger le code contre les modifications futures, au cas où une variable est nommée (dans la portée) égale au membre de la classe.

Il est également considéré comme une bonne pratique (dans certains cercles) d'inclure le Soi quand on se réfère à des membres de la classe pour être clairement clair d'où il vient ce qui aide d'une certaine manière à accélérer la compréhension du code.

Pour spécifiquement Objective-C, il y a une autre différence comme indiqué ici http://answers.oreilly.com/topic/1193-calling-self-object-rather-than-calling-the-object-directly-in-objective-c/

La notation SELF.X passe par les accesseurs générés par la directive @synthesize, alors que X les court-circuite directement.

0

Si vous passez par l'accesseur, vous pouvez y définir des points d'arrêt. Pratique parfois. De même, des choses comme conserver/copier les propriétés ne fonctionneront pas si vous ne passez pas par l'accesseur.

Questions connexes