Dois-je consulter pour soi.propriété dans la méthode init avec l'ARC?
Une question rapide.
si j'ai une propriété et d'un ivar déclarée avec le même nom:
dans le .h fichier:
(Reminder*)reminder;
@property(nonatomic,strong)(Reminder*)reminder;
dans le .m fichier, dois-je utiliser le ivar ou à la propriété dans la méthode init si je suis en utilisant l'ARC?
- (id)initWithReminder:(Reminder*)reminder_ {
self = [super init];
if (self) {
reminder = reminder_;
}
return self;
}
Ou dois-je utiliser la propriété pour obtenir le bénéfice de l'automatique de comptage de référence comme ceci:
- (id)initWithReminder:(Reminder*)reminder_ {
self = [super init];
if (self) {
self.reminder = reminder_;
}
return self;
}
Je ne suis pas sûr à quel point dans l'objet de l'initialisation des propriétés deviennent accessibles avec la notation par points.
- si vous utilisez synthétiser (je suppose que oui) et que vous utilisez un compilateur moderne (je suppose que vous faites en raison de ios5), vous n'avez pas besoin de déclarer le ivar, objective-c le fait automatiquement pour vous. (ce n'est pas la réponse à votre question, juste une note).
- C'est une bonne chose à savoir, j'ai toujours déclaré ivars pour les propriétés jusqu'à maintenant. Et oui, je fais @synthétiser de la propriété avec le nom par défaut.
- Était sur le point de vous dire la même chose que @choix. Et je crois que vous avez toujours obtenir le bénéfice de l'ARC, indépendamment de si oui ou non vous utilisez la propriété.
- Vous n'avez même pas besoin
@synthesize
Vous devez vous connecter pour publier un commentaire.
Utiliser l'accès direct partiellement construit états membres, indépendamment de l'ARC:
C'est parce que
self.whatever
va déclencher d'autres effets secondaires, tels que la Clé-Valeur d'Observation (KVO) les notifications, ou peut-être votre classe implémente (explicitement) ou une sous-classe remplacesetWhatever:
-- et qui pourrait exposer vos partiellement initialisé exemple à d'autres Api (y compris ses propres), qui, à juste titre supposer qu'ils ont affaire avec un objet construit.Vous pourrait vérifier manuellement qu'une classe est capable de fonctionner dans une partie initialisé à l'état, mais qui nécessite beaucoup d'entretien, et (franchement) difficile ou impossible, si d'autres personnes veulent votre sous-classe de la classe. Il exige beaucoup de temps et d'entretien, et il n'y a pas substantiative avantage de le faire, surtout si vous essayez d'utiliser l'approche de la convention.
Donc l'uniforme qui garantit l'exactitude est d'utiliser l'accès direct partiellement construit unis, et éviter d'utiliser les accesseurs.
Note: j'utilise "partiellement construit" parce que l'initialisation n'est que la moitié de l'image;
-dealloc
a les mêmes mises en garde.Un peu plus en détail pourquoi vous devriez utiliser l'accès direct partiellement construit unis (ARC || MRC) peut être trouvé ici: L'initialisation d'une propriété, la notation point
-awakeFromNib
, l'initialisation différée, ou d'une autre phase de l'installation -- dépend de l'objet.Non, vous ne devriez pas!
Vous pouvez trouver la description de la raison de ici
Aussi apple recommande de ne pas le faire. Lire ici
Depuis le point est toujours un Objectif-C (et C méthode réellement en vertu de l'ObjC méthode) la notation par points, ou l'appel de la méthode, est parfaitement sûr, étant DONNÉ la méthode est prêt à traiter avec le type sous-jacent(s) en mémoire dans quel état ils se trouvent.
La règle normale sur la façon d'éviter l'utilisation d'un uninitiatilized (peut-être) le garage d'un segment de mémoire encore s'appliquerait. Qui est la plus forte motivation pour l'utilisation de la ivar dans l'init.
Mais si votre méthode (getter|setter) est capable d'utiliser correctement le segment de mémoire, que c'est d'abord écrit avant de le lire -, puis par tous les moyens à utiliser votre getter dans la méthode init.
Un Paresseux getter tire parti de l'hypothèse qu'un pointeur, il va initialiser commence comme " nil " de décider sur l'exécution de l'initialisation. Si vous ne pouvez pas assumer le contenu initial de votre mémoire, puis l'initialisation de la ivar peut-être le plus sûr.
Pourquoi la règle de ne jamais utiliser incubateurs ou des getters dans l'init si la méthode est capable de fonctionner correctement dans ce scénario?