properties Objective-C avec ou sans variables d'instance

Dupliquer possible:
properties et variables d'instance dans Objective-C 2.0

J'utilise des propriétés uniquement pour les ivars qui ne nécessitent aucune validation réelle lors de l'obtention ou de la définition d'une valeur pour une class que je suis en train de créer.

Ex: @interface ClassB : NSObject { // No ivars } @property (nonatomic, retain) ClassA *obj; @property (nonatomic, retain) NSSsortingng *str; 

Chaque fois que j'appelle ces methods dans la class, j'utilise toujours self.obj / self.str ou [self obj] / [self str]. De cette façon, afin de définir l'état de l'object, vous êtes obligé de passer par la propriété afin que les references soient plus soigneusement gérées par les getters et les setters produits par le compilateur. Cela dit, y a-t-il des problèmes que je peux rencontrer pour créer mes cours de cette façon? En outre, sans ivar présent, une "version" est-elle nécessaire dans une méthode "dealloc" écrasée dans le file @implementation?

Si vous utilisez la directive @synthesize pour créer les accesseurs de propriété, le compilateur crée également les ivars que vous laissez en dehors de la déclaration de class. Vous avez encore besoin de libérer vos ivars. Auparavant, vous ne pouviez pas accéder directement aux ivars synthétisés et vous deviez donc utiliser le setter de propriétés dans votre méthode -dealloc comme ceci:

 - (void)dealloc { self.obj = nil; self.str = nil; [super dealloc]; } 

Ces jours-ci, cependant, le compilateur vous permettra d'accéder directement à l'ivar synthétisé, donc vous pouvez le libérer au lieu d'appeler le setter (ce qui est une bonne idée dans -dealloc, et une mauvaise idée partout ailleurs):

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

Cela changera quand vous finirez par convertir votre code pour ARC (comptage automatique des references) car le compilateur se chargera de libérer vos ivars dans -dealloc pour vous. La plupart du time, cela signifie que votre implémentation de -dealloc peut simplement disparaître.

Il n'est pas nécessaire que vos IVars soient explicitement déclarés. Je reorderais même de les omettre parce que vous devriez TOUJOURS accéder à IVars via des accesseurs (comme vous l'avez indiqué ce que vous faites déjà).

Vous ne rencontrerez aucun problème, sauf que le débogueur n'attrape plus directement les IVars (ils ne s'afficheront pas bien à côté de votre console). – Mais ce n'est pas vraiment un problème.

Dans votre méthode dealloc, vous n'aurez plus besoin de les libérer. Ce que vous devrez faire est nul.

self.obj = nil;

Voici un bref aperçu de ce que les attributes de propriété signifient réellement: (C'est pour vous montrer qu'une release arrive quand vous n'avez pas de variable dans le dealloc)

atsortingbuer

@property (assigner) NSSsortingng * nom;

 name = newValue; 

conserver

@property (retient) NSSsortingng * nom;

 if (name != newValue) { [name release]; name = [newValue retain]; } 

copy

@property (copy) NSSsortingng * nom;

 if (name != newValue) { [name release]; name = [newValue copy]; } 

Le compilateur crée automatiquement l'ivar pour vous, même s'il n'est pas explicitement défini dans la list ivar. Il a le même nom que dans la list des propriétés. Le compilateur n'a tout simplement plus besoin de la ligne de définition en double.

Si vous avez des propriétés (ivars) qui doivent être libérées, faites-le.