Propriété vs Variable d’instance

Duplication possible:
Y a-t-il une différence entre une “variable d’instance” et une “propriété” dans objective-c / cacao / cacao-touch?

Qu’est-ce qu’un cas dans Objective C où vous voudriez utiliser une variable d’instance ou une propriété? Quelqu’un peut-il fournir un exemple réel?

Une variable d’instance est unique pour une classe. Par défaut, seules la classe et les sous-classes peuvent y accéder. Par conséquent, en tant que principe fondamental de la programmation orientée object, les variables d’instance (ivars) sont privées: elles sont encapsulées par la classe.

En revanche, une propriété est une valeur publique pouvant ou non correspondre à une variable d’instance. Si vous voulez créer un public ivar, vous feriez probablement une propriété correspondante. Mais en même temps, les variables d’instance que vous souhaitez garder privées n’ont pas de propriétés correspondantes et ne sont donc pas accessibles depuis l’extérieur de la classe. Vous pouvez également avoir une propriété calculée qui ne correspond pas à un ivar.

Sans propriété, les ivars peuvent être cachés. En fait, à moins qu’un ivar ne soit déclaré dans un en-tête public, il est difficile de déterminer qu’un tel ivar existe.

Une simple analogie serait un livre sous emballage rétractable. Une propriété peut être le title , l’ author ou la couverture rigide ou la couverture souple. Les “ivars” seraient le contenu réel du livre. Vous n’avez pas access au texte actuel tant que vous ne possédez pas le livre; vous n’avez pas access aux ivars à moins que vous ne possédiez la classe.


Plus intéressant encore, les propriétés sont mieux intégrées dans le runtime. Les runtimes 64 bits modernes génèrent un ivar pour les propriétés de l’accesseur, vous n’avez donc même pas besoin de créer l’ivar. Les propriétés sont en fait des méthodes:

 // This is not syntactically correct but gets the meaning across (self.variable) == ([self variable];) (self.variable = 5;) == ([self setVariable:5];) 

Pour chaque propriété, il y a deux méthodes (à moins que la propriété soit déclarée en readonly , auquel cas il n’y en a qu’une): il y a le getter , qui renvoie le même type que le ivar et qui a le même nom comme le setter (qui n’est pas déclaré avec un readonly ); il retourne un void et son nom est simplement ajouté au nom de la variable.

Parce que ce sont des méthodes, vous pouvez y faire des appels dynamics. En utilisant NSSelectorFromSsortingng() et les différentes méthodes performSelector: NSSelectorFromSsortingng() vous pouvez créer un programme très dynamic avec de nombreuses possibilités.

Enfin, les propriétés sont largement utilisées dans Core Data et avec le codage Key-Value . Core Data est un framework avancé pour stocker des données dans une firebase database SQLite tout en fournissant un frontal clair Obj-C; KVC est utilisé dans Core Data et constitue un moyen dynamic d’accéder aux propriétés. Il est utilisé lors du codage / décodage d’objects, par exemple lors de la lecture de fichiers XIB.