Pour les champs privés - je suggère qu'il est prudent d'utiliser uniquement des ivars directs pour les types primitifs (BOOL/int/float etc). Je trouve qu'une bonne pratique est d'encapsuler tout ce qui concerne la gestion de la mémoire dans les propriétés - même pour les champs rarement utilisés. Un avantage supplémentaire de cette approche est que l'IDE met généralement en surbrillance l'accès aux ivars directement, ce qui permet d'avoir une belle séparation entre les champs scalaires simples et les champs de type objet.
Contrairement à cela, je déconseillerais fortement tout ivars direct dans l'interface publique de la classe. En raison de la nature dynamique du langage, cela peut entraîner des erreurs d'exécution extrêmement difficiles à trouver, localiser et corriger. Considérez la hiérarchie suivante
@interface BaseControl
...
@end
@interface Label : BaseControl
...
@end
@interface Button : BaseControl {
@public
BOOL enabled;
}
@end
et un extrait de code
- (void)enableAllButtons {
NSArray *buttons = [self getAllButtons]; // censé contenir uniquement des instances de Button
for (Button *button in buttons) {
button->enabled = YES;
}
}
Imaginez maintenant qu'il y ait une erreur quelque part dans la logique de -getAllButtons et que vous obteniez également des instances de Label dans ce tableau - donc ces instances de la classe Label se verront affecter un ivar manquant. Le fait qui peut être surprenant est que -enableAllButtons ne plantera pas dans ce cas. Mais à ce stade, la structure interne de ces instances de Label est corrompue et cela causera un comportement indéfini et des plantages lorsqu'elles sont utilisées ailleurs.
Tout comme certains problèmes courants de gestion de mémoire (et en général - avec les pointeurs déréférencés) - ce genre de problèmes est difficile à trouver et à localiser - parce que l'apparition de l'erreur est généralement éloignée (en termes de temps, de code ou de flux d'application) du lieu causant l'erreur. Mais avec ce problème particulier, vous n'avez même pas d'outils pratiques (comme des analyseurs de fuites/zombies etc.) pour vous aider à localiser et à corriger - même lorsque vous apprenez comment le reproduire et pouvez facilement enquêter sur l'état erroné.
Évidemment, si vous utilisez @property (assign) BOOL enabled;
, vous obtiendrez une exception d'exécution facile à diagnostiquer et à corriger dans -enableAllButtons.