[Résolu] modifier une ivar
Salut,
je ne suis pas sûr de bien comprendre quand on utilise le "self." pour changer une property, et pourquoi dans le même code on envoie un message à cette même "ivar" mais cette fois sans changer sa property. Exemple avec locationMeasurements :
Donc, si on a besoin de locationMeasurements en dehors de la classe, pourquoi est-ce que l'on envoie ici le message "addObject" directement à l'ivar, et non plutôt à la property (qui ferait coup double et changerait aussi l'ivar) ?
Merci de votre réponse
je ne suis pas sûr de bien comprendre quand on utilise le "self." pour changer une property, et pourquoi dans le même code on envoie un message à cette même "ivar" mais cette fois sans changer sa property. Exemple avec locationMeasurements :
- (void)viewDidLoad {<br /> self.locationMeasurements = [NSMutableArray array];<br />}<br /><br />- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {<br /> [locationMeasurements addObject:newLocation];<br /><br />- (void)viewDidUnload {<br /> locationDetailViewController = nil;<br />}<br /><br /><br />- (void)reset {<br /> [self.locationMeasurements removeAllObjects];<br />}
Donc, si on a besoin de locationMeasurements en dehors de la classe, pourquoi est-ce que l'on envoie ici le message "addObject" directement à l'ivar, et non plutôt à la property (qui ferait coup double et changerait aussi l'ivar) ?
Merci de votre réponse
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Bon déjà le seul truc choquant c'est
à remplacer par self.locationDetailViewController = nil; ou [locationDetailViewController release], locationDetailViewController = nil;
Sauf si celui-ci est en type "assign" (dans ce cas le code est bon) mais c'est quand même zarb comme façon de procéder et pas très sécure je trouve.
Sinon pour
Je ne vois pas du tout le problème.
self.locationMeasurements = [NSMutableArray array]; revient à faire:
[locationMeasurements addObject:newLocation] ou [self.locationMeasurements addObject:newLocation]; revient à faire la même chose. Sauf que dans le premier cas tu accès direct à la iVar, et dans le second tu passes par une méthode (que tu ne vois pas):
(Je pars du principe que tout est en property nonatomic, retain.
Aussi, une erreur que je vois c'est que locationMeasurements est instancié dans viewDidLoad. Donc par précaution et par soucis de gestion mémoire convenable:
Il faut arrêter de penser à accéder à une variable uniquement en utilisant self.quelquechose.
Tant que ce sont vos ivars et que vous vous trouvez dans 'self', pas besoin d'utiliser l'accesseur self.quelquechose. Chose qui ralenti (très légèrement certes) l'exécution du code.
Tu parles aussi de "changer de property". Or ça n'est pas du tout le cas via -addObject:. Certes tu modifies le contenu de ta array, mais tu ne changes pas son adresse mémoire.
Pour que le changement soit reflété dans l'interface utilisateur ça reste plus rapide que d'écrire
Je suis d'accord, mais dans le cas de [self.maArray addObject:...]; c'est totalement inutile. Tu noteras que j'ai parlé d'accéder à une variable, et non la "modifier" (dans le sens release ou ré-instanciation).
et quand on est à l'intérieur de cette même classe, on utilise un setter pour les histoires de "mémoire", en faisant un release et retain sur la nouvelle valeur, pour modifier l'ivar.
Faire : [locationMeasurements addObject:newLocation]; ajoute un élément au tableau, mais c'est aussi faire une opération différente de celle d'un setter, donc pas besoin de toucher aux accesseurs. C'est surtout ce addObject qui me brouille un peu...
En clair,
revient à faire:
revient à faire:
Et donc je t'avouerai que dans le cas de -addObject: il n'y a pas trop utilité à faire [self.quelqueChose addObject:...];
Et comme l'a dit Laudema, on peut très bien faire self.quelqueChose = ... histoire de faire marcher un éventuel mécanisme de KVO.
Si on décide de se passer des getters/setters, il faudra tout faire à la main:
Les propriétés ne sont là que pour nous simplifier la vie, et nous masquer l'implémentation de getters/setters.
Au moment où tu fais -addObject: sur locationMeasurements, tu n'es pas forcé d'utiliser le getter (via self.locationMeasurements) à moins d'avoir une subtilité dans son implémentation.
J'ai en effet regardé sur les scripts que j'ai, et en effet à chaque fois pour les tableaux, la variable n'utilise pas "self."...
Après chacun voit midi à sa porte. Pour ma part j'évite au maximum les [self.bidule doSomething] sauf quand ça devient obligatoire (ex: pour accéder à la vue d'un controller tu dois obligatoirement faire [self view] ou self.view. J'évite aussi de prendre l'habitude de faire self.view même si c'est plus rapide et très tentant.. En soit ça change queudal et ça a même des avantages, mais visuellement je trouve ça laid.
C'était facile...
Merci à toi, Draken tu disais :
t'es sûr de ça? je suis en train de regarder les sample de la doc, mais je vois à chaque fois pour le moment une propriété qui correspond à une variable.
Le pire que j'aie fait ? À mes débuts :
Le compilateur compilait sans se plaindre ...
Après j'ai lu que c'était MAL ..
Après j'ai compris que c'était nul... car reposant sur les automatismes de KVC/KVO implémentés par Apple alors que je n'appelais pas une propriété..
Vu que je l'utilises tout le temps, oui. C'est une évolution assez récente du compilateur et les templates ne sont pas spécialement à jour. Essaye par toi-même avec quelques lignes de code.
Sous Mac OSX, le Modern Runtime (qui permet donc de se passer de la déclaration des ivars associées aux propriétées) n'est utilisé que sur les versions 64 bits par contre en effet.
Donc si tu veux faire du code juste pour ton appli iOS, et donc que tu sais que tu utiliseras le Modern Runtime, nul besoin de déclarer la ivar. Si tu crées du code générique que tu comptes réutiliser ou laisser à la communauté, qui pourrait l'utiliser sous OSX 32 bits, alors déclarer les ivars permet de rendre ton code compatible OSX 32 bits. C'est pour ça qu'on trouve encore bcp de code avec les ivars déclarées.
Mais je suis d'accord avec Draken :