50 votes

Devrais-je faire référence à self.property dans la méthode init with ARC?

Une question rapide.

si j'ai une propriété et d'un ivar déclarée avec le même nom:

dans l' .h fichier:

(Reminder*)reminder;
@property(nonatomic,strong)(Reminder*)reminder;

dans l' .m fichier, dois-je utiliser le ivar ou à la propriété dans la méthode init si je suis à l'aide de 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.

67voto

justin Points 72871

Utiliser l'accès direct partiellement construit états membres, indépendamment de l'ARC:

- (id)initWithReminder:(Reminder*)reminder_ {
    self = [super init];
    if (self) {
        reminder = reminder_;
        // OR
        reminder = [reminder_ retain];
    }
    return self;
}

C'est parce qu' 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 remplace setWhatever: -- 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 pourriez 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.

Plus de détails quant à pourquoi vous devriez utiliser l'accès direct partiellement construit unis (ARC || MRC) peut être trouvé ici.

5voto

Konstantin Koval Points 804

Non vous ne devriez pas!

Vous pouvez trouver une description pourquoi ici
Apple recommande également de ne pas le faire. Lire ici

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