Il s'agit avant tout d'utiliser un code idiomatiquement cohérent. Si vous modèlez tout votre code de manière appropriée, il existe des ensembles de règles garantissant que l'utilisation d'un accesseur dans init/dealloc est sûre.
Le gros problème est que (comme l'a dit mmalc) le code qui définit l'état par défaut des propriétés ne devrait pas passer par un accesseur car cela entraîne toutes sortes de problèmes désagréables. Le hic, c'est qu'il n'y a aucune raison pour que init initialise l'état par défaut d'une propriété. Pour plusieurs raisons, je suis passé à des accesseurs qui s'initialisent eux-mêmes, comme dans le simple exemple ci-dessous :
- (NSMutableDictionary *) myMutableDict {
if (!myMutableDict) {
myMutableDict = [[NSMutableDictionary alloc] init];
}
return myMutableDict;
}
Ce style d'initialisation de propriété permet de reporter beaucoup de code d'initialisation qui n'est peut-être pas réellement nécessaire. Dans le cas ci-dessus, init n'est pas responsable de l'initialisation de l'état des propriétés, et il est tout à fait sûr (voire nécessaire) d'utiliser les accesseurs dans la méthode init.
Admettons que cela impose des restrictions supplémentaires à votre code, par exemple, les sous-classes avec des accesseurs personnalisés pour une propriété dans la superclasse doivent appeler l'accesseur de la superclasse, mais ces restrictions ne sont pas excessives par rapport à diverses autres restrictions courantes dans Cocoa.