2010-09-19 26 views
0

Je sais que vous utilisez @synthesize pour créer des méthodes setter et getter, ce qui rend les choses plus faciles parce que vous n'avez pas besoin d'écrire les vôtres. Il y a certains endroits où vous devez utiliser self.property au lieu de juste la propriété pour utiliser les méthodes setter et getter, comme dans dealloc et initWithCoder. Cela me dit que ces méthodes setter et getter font quelque chose d'autre qui est important, en plus de faciliter la définition et l'obtention d'une variable. Que font-ils et comment le font-ils?méthodes setter et getter

Répondre

5

Ils font tout ce que vous leur avez dit de faire dans l'instruction @property ou votre propre implémentation, si vous avez choisi d'en écrire une. Le plus souvent, la raison d'utiliser les accesseurs plutôt que de modifier directement les variables d'instance est d'éviter les fuites de mémoire. Imaginez une variable d'instance NSString déclarée avec

@property (nonatomic, retain) NSString *myString; 
@synthesize myString; 

Ces lignes génèrent un accesseur qui appelle correctement release et retain lorsque vous souhaitez modifier la propriété myString d'un objet. Si vous n'avez pas appelé l'accesseur, vous risquez de perdre l'ancienne valeur, à moins que vous n'ayez pris soin de gérer vous-même la mémoire.

3

Votre précepte de base:

Il y a certains endroits où vous devez utiliser self.property au lieu de propriété juste pour utiliser des méthodes setter et getter, comme dans dealloc et initWithCoder .

Cela me dit que ces méthodes setter et getter font quelque chose d'autre qui est important ...

est pas tout à fait correct. La différence ici est que l'utilisation de self.propertyname invoque spécifiquement le getter/setter lorsqu'il est utilisé dans cette classe, où l'utilisation directe de propertyname ne le fait pas - il accède directement aux variables d'instance.

Per @Carl Une bonne pratique est que vous utilisiez la séquence getter/setter partout où vous le pouvez, car cela vous évite de manquer un cas de gestion de la mémoire.

2

Je seconde ce que @heckj et @Carl ont dit, mais je dois ajouter un point de plus.

En général, il estpas sûr à utiliser accesseurs dans les deux init ou dealloc. Le problème est que votre classe peut être sous-classée, les accesseurs peuvent être remplacés. Ces accesseurs peuvent alors accéder à d'autres propriétés de votre classe ou d'une sous-classe. Cela pourrait conduire à des accidents:

  • Dans le cas de init ceux-ci ne sont pas encore initialisé (car en init le premier appel que vous faites est [super init]).
  • Dans le cas de dealloc, ceux-ci ont déjà été libérés (parce que dans dealloc le dernier appel que vous faites est [super dealloc]).

Dans la pratique vous peut utiliser accesseurs dans init et dealloc. Sous deux prémisses:

  • Vous savez ce que vous faites. (voir ci-dessus)
  • Vous contrôlez tout le code peut-être héritant. (ne s'applique pas aux cadres, etc.)