2009-06-03 8 views
0

Dites que j'ai une sous-classe FooController de UIViewController qui affiche une liste de Foo s. Quelle est la meilleure pratique pour gérer mon cycle de vie de la propriété foo? Puis-je définir le @property comme étant en lecture/écriture?Initialisation de la sous-classe UIViewController

Ce n'est pas vraiment - une fois qu'il a été mis en place, le changement pourrait entraîner un état incohérent. Dois-je créer le @property en tant que readonly et écrire un nouvel initialiseur désigné, initWithFoo:(Foo *) aFoo qui appelle initWithNibName:bundle:? Maintenant, je dois créer une nouvelle instance à chaque fois que le contrôleur est retiré de la pile, et je continue avec un nouveau foo. Ce dernier me semble être l'approche à adopter, mais je n'ai jamais vu quelqu'un faire ça. Alors, quelle est la pratique standard?

Répondre

3

Les propriétés sont généralement la voie à suivre. Ils vous donnent la puissance de KVC/KVO

Vous devez définir la classe en tant qu'observateur de la propriété Foo (KVO). Puis, à chaque fois que Foo est changé, vous avez la possibilité de gérer cela. Pas besoin de s'inquiéter de l'incohérence.

 [self addObserver:self forKeyPath:@"foo" options:0 context:@"fooChanged"]; 

observe alors le changement:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ 

    if([keyPath isEqualToString:@"foo"]){ 

     //do your thing 


    } 
} 

Maintenant, il n'a pas d'importance si foo est situé dans le initialiseur ou quelque temps plus tard, vous pouvez y faire face. Vous ne voulez pas que votre code casse en forçant des objets à travailler avec votre classe dans un ordre prédéterminé. C'est une pratique très inflexible et généralement mauvaise. De cette façon, vous pouvez gérer ces changements avec élégance.

0

Objective-C est un langage dynamique. Donc, ne soyez pas si strict dans l'encapsulation. Cet ivar pourrait être atteint pensé KVC de toute façon. Donc @property (readwrite) est OK.

Questions connexes