54 votes

Objective-C 101 (conserver vs affecter) NSString

Une question 101

Disons que je suis en train de faire de la base de données de voitures chaque voiture de l'objet est définie comme:

#import <UIKit/UIKit.h>

@interface Car:NSObject{
    NSString *name;
}

@property(nonatomic, retain) NSString *name;

Pourquoi est-il @property(nonatomic, retain) NSString *name; et pas @property(nonatomic, assign) NSString *name;?

Je comprends qu' assign ne s'incrémente pas le compteur de référence en tant que retain le fera. Mais pourquoi utiliser retain, depuis name est membre de l' todo objet de la portée de la il est à lui-même.

Aucune autre fonction externe permettra de le modifier.

68voto

Chuck Points 138930

Il n'y a pas une telle chose comme "l'étendue d'un objet" en Objective-C. Champ d'application des règles n'ont rien à voir avec la vie de l'objet - l'conserver le comte, c'est tout.

Vous avez généralement besoin de revendiquer la propriété de vos variables d'instance. Voir l'Objective-C gestion de la mémoire règles. Avec un retain de la propriété, de votre propriété, setter revendique la propriété de la nouvelle valeur et renonce à la propriété de l'ancien. Avec un assign de la propriété, l'entourant de code a faire ce qui est juste comme gâchis en termes de responsabilités et de séparation des préoccupations. La raison pour laquelle vous avez utiliser un assign de la propriété est dans un cas où vous ne pouvez pas conserver la valeur (tels que la non-objet de type BOOL ou NSRect) ou lorsque son maintien est susceptible d'entraîner des effets indésirables.

Par ailleurs, dans le cas d'une NSString, le bon type de propriété est habituellement copy. De cette façon, il ne peut pas changer de sous vous si quelqu'un passe dans un NSMutableString (qui est valide - c' est une sorte de NSString).

19voto

Axel Points 943

et n'oubliez pas d'y accéder via

 self.name = something;
 

parce que

 name = something;
 

ne se souciera pas des méthodes setter / getter générées mais assignera directement la valeur.

12voto

fbrereto Points 21711

Sans retain rien ne garantit que les NSString* vous définissez name vivront plus longtemps que la déclaration d'affectation elle-même. En utilisant la propriété retain pour le programme de synthèse synthétisé, vous lui permettez d'indiquer au système de gestion de la mémoire qu'il existe au moins un autre objet souhaitant conserver les NSString* .

9voto

tbone Points 7147

Pour ceux qui le recherchent, la documentation d'Apple sur les attributs de propriété est ici .

9voto

jem Points 91

Le self. dans:

 self.name = something;
 

est important! Sans cela, vous accédez directement à la variable et contournez le setter.

Le style plus ancien (corrigez-moi si je me trompe) aurait été:

 [self setName:something];
 

Quoi qu'il en soit, cette notation était le conseil (à la sonorité vague) que j'avais vraiment besoin lorsque je cherchais le bon @properties sur NSStrings . Merci Axel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X