2010-07-23 6 views
0

Je suis simplement curieux du rôle que joue l'individu dans un objet. Je comprends que l'écriture [[self dataForTable] count] se réfère directement à l'iVar contenue dans cet objet. Mais si vous vous trompez et que vous spécifiez directement l'iVar [dataTable count], en quoi cela diffère-t-il, que protégez-vous en utilisant self, est-ce juste pour spécifier un iVar plutôt que peut-être une variable locale similaire?iVars, avec et sans soi?

@implementation ViewController 
@synthesize dataForTable; 

... 

NSUInteger dataCount = [[self dataForTable] count]; 

beaucoup apprécié

Gary.

Répondre

1

L'écriture du compte [[self dataForTable]] ne fait pas référence à directement à l'iVar. Il y a quelques trucs dans les coulisses ...

Si vous utilisez un ivar dans votre code sans auto, c'est un accès direct à l'ivar. Si vous utilisez [self someIvarName] ou self.someIvarName, vous envoyez un message à l'objet (qui est self). Le moteur d'exécution tente de résoudre ce message et utilise l'un des mécanismes suivants: Si vous avez défini une méthode avec un nom correspondant, cette méthode sera utilisée si aucune méthode (ou propriété) n'existe, puis codage de valeur-clé utilisera un ivar nommé par défaut. En ce qui concerne l'impact, cela sera différent en fonction de votre code. Par exemple, si votre propriété est une propriété retenue (par opposition à attribué), il y a une différence significative entre:

someVar = nil 

et

self.someVar = nil 

Le setter synthétisé sera correctement libérer someVar avant de le mettre à zéro , alors que dans le premier exemple, vous avez maintenant une fuite de mémoire. Ceci est juste un exemple de la différence.

+0

Très apprécié. – fuzzygoat

0

[self foo] appelle la méthode -foo (pas iVar, méthode d'instance) sur self.

self.bar utilise la syntaxe @property pour accéder au bar iVar, en appelant les méthodes getter/setter (-bar et -setBar:) sur soi-même.

En se référant à l'iVar directement sans "self". (par exemple bar = @"some text") contourne le getter/setter. Cela peut être une mauvaise chose si le setter est (par exemple) censé faire un copy ou retain sur la nouvelle valeur.

+0

Je définirais la barre en utilisant: [self setBar: @ "some text"]; en tant que votre «réglage» quelque chose. Dans l'exemple [[self dataForTable] count]; est-ce en utilisant un getter alors, où [dataForTable count] ne serait pas? – fuzzygoat

+0

count est un getter sur dataForTable dans les deux cas, mais dans le premier cas, vous utilisez un getter pour dataForTable et dans la seconde vous accédez directement à l'ivar. –

+0

Je vois, merci ... – fuzzygoat

Questions connexes