2010-12-27 5 views
3

J'ai une classe objective-c avec des variables membres. Je crée des getters et setters pour chacun. Surtout à des fins d'apprentissage. Mon setter se présente comme suit:Affectation de variables membres Objective-C?

- (void) setSomething:(NSString *)input { 
something = input; 
} 

Cependant, en C++ et d'autres langues que j'ai travaillé dans le passé, vous pouvez référencer la variable membre en utilisant le pointeur this comme this->something = input. Dans l'objectif-c, cela s'appelle self. Donc je me demandais si quelque chose comme ça est possible dans l'objectif-c? Quelque chose comme ceci:

- (void) setSomething:(NSString *)input { 
[self something] = input; 
} 

Mais ce appelleraient le getter pour something. Donc je ne suis pas sûr. Donc ma question est:

Y at-il un moyen que je peux faire l'affectation en utilisant le pointeur auto?

Si oui, comment?

Est-ce une bonne pratique ou est-ce mal?

Merci!

Répondre

4

Oui, il utilise la même syntaxe que C++, avec self en place de this:

self->something = input; 
+4

Cependant, il vaut la peine de mentionner que 'self->' n'est pas requis et que personne n'écrit de code comme ça. – benzado

+0

En fait, certains d'entre nous utilisent effectivement 'self' pour clarifier le contexte, en faisant la différence entre un membre d'objet et une variable locale. –

2

Vous utilisez efficacement "auto" implicitement lorsque vous utilisez ...

something = input; 

... s'il n'y a pas de variable "quelque chose" locale. (ie: Il n'y a vraiment pas besoin d'ajouter un "self" explicite, et les gens généralement ne le font pas.)

Cela dit, votre exemple de code ne conserve pas l'entrée, donc il ne va probablement pas faire quoi vous vous attendez (enfin, pas pour longtemps sans crash dans le cas d'un NSString).

En tant que tel, si vous voulez vraiment écrire vos propres setters (l'Objective-C property/synthesize mis en place est un beaucoup moins de tracas), vous aurez besoin d'utiliser quelque chose comme:

- (void) setSomething:(NSString *)input { 
    if(something != input) { 
     [input retain]; 
     [something release]; 
     something = input; 
    } 
} 
+0

Pour éviter l'écart entre l'abandon de l'ancienne valeur et l'attribution de la nouvelle valeur (conservée), un idiome consiste à libérer automatiquement l'ancien 'something'. – Richard

+1

Il est généralement plus approprié de copier des chaînes au lieu de les conserver. – d11wtq