[Débutant] @property épargne la définition des variables ?

colas_colas_ Membre
mars 2013 modifié dans Objective-C, Swift, C, C++ #1
Bonjour,



selon où je regarde, je vois des fois :
<br />
@interface MaClasse : NSViewController<br />
{<br />
	NSString * maVariable ;<br />
	NSString * maVariableOutlet ;<br />
}<br />
@property(copy) NSString * maVariableOutlet ;<br />




et d'autres fois


<br />
@interface MaClasse : NSViewController<br />
{<br />
	NSString * maVariable ;<br />
}<br />
@property(copy) NSString * maVariableOutlet ;<br />




La seconde méthode est-elle valable ?



Merci !



PS : n'est-elle pas préférable dans le cas des outlets, pour ne pas oublier les getters et setters ?

Réponses

  • HerveHerve Membre
    Je pense qu'il vaut mieux déclarer la variable dans le constructeur. Donc la première méthode me semble être plus sure pour éviter les bugs par fuite de mémoire.
  • AliGatorAliGator Membre, Modérateur
    Depuis le Modern Runtime, c'est à  dire depuis OSX 64 bits pour OSX, et dès les premières versions 2.0 pour iOS, il n'a jamais plus été nécessaire de déclarer les variables d'instance associées aux propriétés. Le compilateur le fait pour toi.



    Il n'y a vraiment que si tu codes encore pour OSX 32 bits que tu dois les rajouter si je ne dis pas de bétises, car OSX 32 bits est le seul qui utilise encore le Legacy Runtime (l'ancien Runtime Objective-C, devenu obsolète depuis, et à  qui il commence à  manquer plusieurs petits avantages sur le Modern Runtime utilisé partout aujourd'hui)



    Après, si tu veux quand même déclarer explicitement ces variables d'instances associées aux propriétés, tu peux le faire. Certains bouquins ou tutos le font encore d'ailleurs, tout simplement par force d'habitude, parce que les personnes qui écrivent ces tutos ont appris à  coder du temps du Legacy Runtime, d'OSX 32 bits et d'Objective-C 1.0, et ont gardé l'habitude, mais ce n'est plus nécessaire depuis le Modern Runtime et Objective-C 2.0 !
  • ThibautThibaut Membre
    mars 2013 modifié #4
    Si ça se fait à  la compilation, quel est le rapport avec le runtime ?



    Pour info, si une property est déclarée en readonly et que le getter est réimplémenté, il faut déclarer la variable associée.

    De même si une property en readwrite a son getter et son setter de réimplémentés.

    En fait, à  partir du moment où une des méthodes déclarées grâce au property est implémentée de manière automatique, la déclaration de la variable n'est plus nécessaire.



    Et une property nommée myProperty, en l'absence de @synthesize, voit sa variable déclarée sous le nom _myProperty.
  • AliGatorAliGator Membre, Modérateur
    mars 2013 modifié #5
    Parce que le Legacy Runtime (et Objective-C 1.0) ne permet pas de réagencer les variables d'instance d'une classe sans recompiler toutes ses sous-classes. Du coup le compilateur ne peut pas rajouter des variables d'instance à  la volée à  moins d'imposer un ordre de compilation bien précis, avec des risques de cycle de dépendance, etc... Bref c'était simplement pas possible ou alors très compliqué d'implémenter ça dans le compilateur avec le Legacy Runtime.



    https://developer.ap...sPlatforms.html
    There are two versions of the Objective-C runtime"“modern” and “legacy”. The modern version was introduced with Objective-C 2.0 and includes a number of new features. The programming interface for the legacy version of the runtime is described in Objective-C 1 Runtime Reference; the programming interface for the modern version of the runtime is described in Objective-C Runtime Reference.

    The most notable new feature is that instance variables in the modern runtime are “non-fragile”:
    • In the legacy runtime, if you change the layout of instance variables in a class, you must recompile classes that inherit from it.
    • In the modern runtime, if you change the layout of instance variables in a class, you do not have to recompile classes that inherit from it.


    In addition, the modern runtime supports instance variable synthesis for declared properties (see “Declared Properties” in The Objective-C Programming Language).
Connectez-vous ou Inscrivez-vous pour répondre.