Dans Cocoa, addObserver:forKeyPath:options:context:
ne conserve ni "le récepteur, ni un serveur d'observations". Par conséquent, je suppose que l'observation du soi est autorisée; qui est, il est tout à fait valable de faire quelque chose commeObservation de soi dans Cocoa
[self addObserver:self forKeyPath...]
Tant que vous vous souvenez de désenregistrer self
à titre d'observateur comme la première chose à dealloc.
Cette hypothèse est-elle correcte?
Ce n'est pas une bonne idée. On s'attend généralement à ce que 'obj.foo = bar;' soit équivalent à '[obj setFoo: bar];' et s'éloigner de ce modèle va dérouter les autres qui lisent/maintiennent votre code – rpetrich
@rpetrich Je suis d'accord que ce n'est pas une bonne idée (j'ai écrit cette réponse il y a plus de 18 mois), mais pour une raison différente. Je n'utiliserais plus '@ synthesize'; J'écrirais maintenant tout le getter et le setter. Le fardeau supplémentaire de quelques lignes supplémentaires l'emporte sur le coût de suivre mentalement les appels de méthode supplémentaires (j'utiliserais toujours '@ property'). Je ne suis pas d'accord que les effets secondaires chez les setters (ou getters) sont intrinsèquement mauvais. Ils devraient être évités si possible. Par exemple, définir 'hypotheticalQueryObject.maxResults = 4;' pourrait légitimement déclencher une autre recherche. –
@rpetrich Cela est garanti. 'obj.foo = bar;' utilise toujours l'implémentation de 'setFoo:' fournie (même si vous avez remplacé une version synthétisée). –