Question

(Juste pour vous laisser, j'apprends à développer pour iPhone avec un livre que j'ai intitulé Début de développement pour iPhone 3: Exploration du SDK, et je n'utilise pas Interface Builder) Y a-t-il une raison d'utiliser le getter dans la même classe lorsqu'un membre privé est visible? Comme dans Foo.h, ayant

NSObject *myObj;
...
@property (nonatomic, retain)NSObject *myObj;

puis dans Foo.m, accéder au membre myObj à l'aide de self.myObj (ou [self myObj])? Parce que dans mon livre, voici ce qu'il vous dit d'écrire dans l'une des applications (pour vérifier si le point de vue d'un membre UIViewController est dans la vue d'ensemble):

if(self.yellowViewController.view.superview == nil) {

(remarquez le self .yellowViewController ...) Y a-t-il une raison à cela? S'il n'y a pas une seule idée que j'ai, c'est peut-être que le membre blueViewController appartient à la classe BlueViewController. Je pense donc que s'il n'y a pas de raison que ce soit pour éviter toute confusion. Y a-t-il donc un moment où l’utilisation du getter dans la même classe est nécessaire?

Merci !!

Était-ce utile?

La solution

Oui, accéder à vos ivars par un getter plutôt que directement est une bonne chose à faire.

À titre d'exemple: l'un des modèles de conception habituels dans Cocoa (notamment au téléphone, où les ressources sont très limitées) est appelé "chargement paresseux".

En résumé, cela signifie que vous ne chargez pas une ressource tant que vous n'en avez pas besoin.

Idéalement, vous souhaitez placer dans votre getter un code permettant de vérifier si la ressource demandée est chargée et, dans le cas contraire, de le charger. Accéder à l'ivar directement reviendrait à zéro. L’alternative serait d’initialiser tous les ivars lors du lancement de votre classe parent, ce qui entraînerait potentiellement un gaspillage de ressources pour le stockage de données qui pourraient être nécessaires ou non.

Ceci vous permet également de placer des ressources susceptibles d'être récupérées dans vos méthodes applicationDidReceiveMemoryWarning: et de les vider lorsque les ressources deviennent serrées, car elles seront chargées à la demande si nécessaire.

Autres conseils

Chargement paresseux:

- (UIImageView*) getImageView
{
    if (!imageView)
    {
        imageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"blah.png"]]; // just an example
    }
    return imageView;
}

En fonction de la définition de imageView (copier, attribuer, conserver), vous devrez modifier l'affectation réelle, mais c'est ce que l'on entend par chargement paresseux.

Quelques raisons d'utiliser la syntaxe getter self.ivar au lieu d'accéder directement à la variable d'instance:

  • Propriétés de chargement paresseux, comme d'autres l'ont mentionné
  • Les sous-classes peuvent vouloir remplacer la propriété et avoir le respect de la super-classe que
  • Si vous utilisez des propriétés atomiques, le seul moyen correct d'accéder à la propriété consiste à utiliser le getter
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top