8
votes

Objective-C Propriétés dans le développement de l'iPhone

Quelle est la différence entre une propriété et une variable d'instance dans l'objectif-c. J'ai besoin de comprendre cela en termes de OOP. Est une déclaration de propriété juste une enveloppe de commodité (avec @synthesize dans la mise en œuvre) pour accéder aux variables d'instance?

merci,

codecowboy.


0 commentaires

3 Réponses :


4
votes

Je pense que vous êtes à peu près là-bas. Le @property et @synthesize rendent les déclarations et la mise en œuvre des accesseurs pour la IVAR déjà déclarée. Vous avez également divers attributs que vous pouvez définir sur le @property vous permettant de contrôler comment il est généré de la rendre appropriée pour l'ivar

regarder " OBJECTIF C 2.0 Déclaré Propriétés "


0 commentaires

7
votes

Les propriétés et les ivars sont deux choses complètement différentes.

et une variable d'instance est une variable stockée à l'intérieur de l'objet, de sorte que chaque instance a sa propre. Il est référencé par addition de pointeur par rapport au pointeur d'objet / auto (légèrement indirect pour le temps d'exécution moderne, mais équivalent fonctionnellement). Les ivars sont généralement internes à une classe et par défaut ne peuvent être consultés que par la classe et ses descendants (@Protection). Dans les méthodes, ils sont disponibles sans qualification, sinon elles le peuvent (mais sont rarement, la publicité ne devrait pas être consultée par indirection, par exemple, obj-> ivar.

une propriété définit un getter et un réglage (le setter est facultatif) interface. C'est tout ce que ça fait. Il définit deux méthodes publiques: xxx

Ceux-ci sont définies comme des méthodes exactement comme si vous les avez déclaré comme ça, pas plus, pas moins. Ces méthodes sont appelées avec la syntaxe normale ([Obj Propname] et [Obj SetPropname: N] ou à l'aide de la notation de points modernes (obj.propname ou obj.propname = n). Ces deux options sont syntaxiquement différentes seulement, elles se comportent de manière identique. et vous pouvez utiliser la notation de point si les méthodes sont déclarées avec @property ou déclaré manuellement comme ci-dessus.

Vous devez ensuite mettre en œuvre les méthodes de la mise en œuvre, soit en écrivant les méthodes vous-même, en utilisant @synthesize, ou en manipulant la méthode manquante de manière dynamique.

Propriétés peut être soutenu par un ivar (nommé identique ou nommé différemment (ma préférence pour éviter toute confusion)) ou non. Ils peuvent ne pas stocker leur valeur ailleurs, ou ils peuvent le calculer à partir d'autres données.

Par exemple, vous pourriez avoir: xxx

puis mettre en œuvre - (Nstring *) Nom complet pour renvoyer la Concaténation de FirstName et nom nominal.


3 commentaires

C'est exactement où ma confusion réside. Un exemple d'objet ne possède-t-il pas de ses propres propriétés? Ma compréhension des objets en termes généraux est qu'ils contiennent des informations sur l'état (données) et le comportement (méthodes). Pourquoi ai-je besoin de variables et de propriétés d'instance? Les variables d'instance sont-elles immuables à moins que je ne les déclare comme propriétés?


Une propriété est une interface pour des objets externes pour obtenir et définir des données. Une variable d'instance est interne à cet objet, bien qu'elle puisse être exposée à des objets extérieurs à l'aide de propriétés, de ses propres méthodes getter / setter, ou indirectement à travers d'autres méthodes publiques que vous créez.


En d'autres termes, la déclaration de propriété ne crée pas quelque chose dans l'objet d'instance. Cela dit simplement au monde extérieur comment obtenir quelque chose de l'objet. Que quelque chose pourrait être une variable d'instance, ou si vous voulez être une information sur laquelle vous souhaitez écrire la méthode Getter et Setter. Comme pour les variables d'instance, elles peuvent être accessibles comme si vous le pouvez dans C et C ++.



0
votes

La différence entre propriété instance ivar est, la variable qui fait comme Propriété qui peut être visible dans une autre classe alors que d'accéder à l'ivar ou à l'instance, vous devez créer l'objet de cette classe, puis vous pouvez accéder. et avec l'utilisation de @synthesize compilateur générera le régleur et getter pour cette propriété.

- (type) Nom; Méthode -Getter

- (vide) SetName: (Type) Aname; Méthode Setter


0 commentaires