Nouvelle façon d' écrire les IBOutlet dans xcode 4.6

J889J889 Membre

Bonjour,


 


Ma dernière application a été faite avec xcode 4.2  sur snow leopard mais mon macbook pro étant devenu super lent j' ai du le changer et installer le nouveau xcode 4.6.2


 


Pourquoi avec la nouvelle version xcode, dans le (void dealloc) il rajoute un"_" devant les IBOutlet ?



- (void)dealloc {
    [_bonjour release];
    [_bouton release];
    [super dealloc];
}

Est on obligé de garder ce "_" ?


 


Par exemple, lorsque je nomme un IBOutlet je n' ai pas utilisé de "_" :



@property (retain, nonatomic) IBOutlet UILabel *bonjour;
@property (retain, nonatomic) IBOutlet UIButton *bouton;

- (IBAction)bouton1:(id)sender;

Mais si je veux utiliser le label je dois utiliser les "_" devant.



- (IBAction)bouton1:(id)sender {
    
    _bonjour.textColor = [UIColor blueColor];
     
     }

Merci d' avance.


Réponses

  • AliGatorAliGator Membre, Modérateur
    C'est le nom par défaut de la backing variable associé les autosynthesized properties.


    Si tu veux utiliser un autre nom pour ta backing variable il faut que tu précises le @synthesize explicitement.

    Si tu veux éviter tout ça tu migres vers ARC, ce qui est de toute façon fortement recommandé.

    Avec ARC tu n'auras même plus de dealloc à  écrire et du coup plus aucune raison d'avoir de mention de la backing variable dans ton code plutôt que la propriété. Du coup tu n'auras plus à  te poser la question !
  • AliGatorAliGator Membre, Modérateur
    juin 2013 modifié #3

    Mais si je veux utiliser le label je dois utiliser les "_" devant.



    Non, du tout. Là  en écrivant "_label1" tu utilises la variable d'instance associée implicitement à  la propriété "label1" (car avec les propriétés maintenant automatiquement synthétisées c'est comme si tu avais écrit "@synthesize label1 = _label1"), tu n'utilises donc pas la propriété dans ce cas !


    Avant que le compilateur ne supporte la synthèse automatique des propriétés, certains avaient tendance à  écrire "@synthesize label1" tout court, synonyme de "@synthesize label1 = label1", ce que personnellement je déconseillais car cela utilisait le même nom pour la propriété et sa variable d'instance associée, ce qui fait que du coup beaucoup confondaient les deux (et c'était certainement ton cas vu ta question)


    Maintenant, par défaut la propriété "label1" est synthétisée a l'aide de la backing variable "_label1" et pas "label1" (ce que perso je préconisais et faisait déjà  avant l'apparition des autosynthesized properties, en utilisant systématiquement "@synthesize maprop = _maprop" pour avoir des noms distincts entre la propriété et son ivar) donc il n'y à  plus de risque de confondre entre la propriété et sa variable d'instance.


    Si tu veux accéder a la propriété "label1" et non à  la variable d'instance "_label1", ce que tu devrais d'ailleurs toujours faire, il faut utiliser "self.label1" (ou "[self label1]" et "[self setLabel1:...]" si tu préfères ces notations mais qui montrent moins je trouve l'usage de la propriété mais plutôt de ses accesseurs donc moins lisible IMHO) et ne jamais utiliser "_label1" directement (sauf dans de rares cas très précis, comme par exemple dans le dealloc, si jamais tu n'as pas activé ARC et dois donc l'implementer, pour éviter de déclencher KVO et mutex inutles en particulier, mais bon).


     


     


    L'avantage d'utiliser la propriété self.label1 étant d'être assuré d'utiliser les accesseurs, et donc de gérer le KVO, l'atomicité et le thread-safety de la variable, respecter la gestion mémoire associée à  la propriété... Donc je le conseille très très fortement.


    En plus si tu utilises ARC et n'a donc plus à  gérer les retain/release, tu n'as plus à  écrire le dealloc, et entre ça et ne plus avoir non plus à  écrire de @synthesize, c'est finalement totalement transparent dans ton code : perso je n'utilise que les propriétés et plus jamais des variables d'instance (sauf en cas d'optimisation drastique nécessaire, et encore) ce qui du coup fait comme si j'en avais pas, c'est totalement masqué et je ne risque pas d'avoir des soucis de gestion mémoire, KVO ou thread-safety à  cause d'une utilisation d'une ivar au lieu de la propriété (et donc des accesseurs)


  • MAGEMAGE Membre

    eh, merci Ali pour ces précisions. Je viens de me rendre compte que j'avais des _maVariable qui devraient être self.maVariable et surtout pourquoi  ::)


  • J889J889 Membre
    Merci pour cette réponse.
  • samirsamir Membre


    En plus si tu utilises ARC et n'a donc plus à  gérer les retain/release, tu n'as plus à  écrire le dealloc, 




     


    Juste une précision :), l'utilisation de ARC n'exclut pas l'écriture de dealloc, mais plutôt on a plus besoin de release les ivars et et 'appel au [super dealloc], mais on peux utiliser dealloc pour se désabonner des notifications par exemple.

  • AliGatorAliGator Membre, Modérateur

    Tout à  fait, je confirme ;)


Connectez-vous ou Inscrivez-vous pour répondre.