Programmation Cocoa sous MacOsX 3ème édition en Français est sorti
Gercofis
Membre
Ben ! dans le titre ( dire que j'allais acheter l'original... )
Bref très bien fait ...
J'avoue ne pas capter la partie supérieure de la page 60, au cas ou ?
Bref très bien fait ...
J'avoue ne pas capter la partie supérieure de la page 60, au cas ou ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Moi qui trouvais que c'était beau à pleurer (constructeurs virtuels, etc...) !
Plus sérieusement, Schlum, c'est quoi que tu trouves foireux dans les constructeurs en Objective-C ?
+
Chacha
En C++ les constructeurs et destructeurs ne s'héritent pas ; il ne renvoient pas non plus de référence (ils ne renvoient rien en fait), et le compilateur envoie un warning si certains composants de l'objet ne sont pas initialisés ; quant au constructeur par défaut, il met tout à 0.
Toutes ces choses sont d'une logique foudroyante, mais ne sont pas faites en Objective-CÂ En gros on s'aperçoit des m***** au moment de l'exécution et pas de la compilation !
Ben oui, mais en C++, un échec de construction est pénible à gérer, alors que la séparation alloc/init est fort pratique. Exemple : reproduire le protocole NSCoding en C++ est pénible.
En C++, le constructeur par défaut ne met *pas* tout à zéro, ce n'est pas dans le standard ! Par contre, en Objective-C, c'est le cas (http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Articles/chapter_4_section_2.html)
à l'usage, le switch "check effective C++ violations" est plutôt lourdingue, je trouve... Surtout quand on encapsule des objets.
Question de goût, je suppose...
+
Chacha
Et les init en ObjC sont simples ! Il suffit de s'accorder sur les règles : un seul initialisateur désigné qui appel l'initialiseur désigné de la super-classe, et la surcharge de l'initialiseur désigné de la super-classe. Et avec ça quelque soit le nombre de constructeur de la super-classe, ils seront tous gérés.
Mais bon ça fait plaisir...
Mon anglais et mes compétences étant limites...
Peut-être vérifier sur la version Anglaise ?
Peut-être lui écrire : aaron@bignerdranch.com
Je demande a l'éditeur l'adresse pour les coquilles, ou petites erreurs, par là même je demande les émails des traducteurs, bien que ce code a pas dû être modifié...
Je me suis emmêlé les pinceaux ; je voulais dire que s'il y avait un autre constructeur défini, et pas de constructeur par défaut défini explicitement ; on ne pouvait appeler le constructeur par défaut, même s'il est défini dans la classe mère (et ça pète à la compilation).
Pour la remise à 0, effectivement, ce n'est pas standard... gcc le fait pour un objet seul, et pas pour un tableau d'objets.
En fait il n'y a pas de constructeurs en Objective-C, juste des allocations ; les constructeurs sont des méthodes comme les autres et sont " héritables " (ce qui est un non-sens).
ça oblige à avoir des constructions d'objets très propres et rigoureuses, c'est sûr :P
Pourquoi à bannir ? Il désalloue l'objet et renvoie "nil" (ce qui ne sert à rien puisqu'il y a un, throw), donc se comporte comme si l'allocation avait échouée.
S'il ne faisait pas ça, imaginons qu'on ait un @try au-dessus, on ne saurait pas si la mémoire a été effectivement allouée ou non !
(mais c'est clair que ça montre les limites du système de "Â construction d'objets " en Obj-C).
Je n'irai jamais assez dans ton sens : les warnings sont nos amis.
par contre, j'ai quand même du mal avec -Weffc++. Exemple :
J'aurais plutôt eu tendance à utiliser [self autorelease] en cas de construction foireuse, et renvoyer nil. Je trouve ça assez propre, et ça simplifie beaucoup le code, en fait, car en amont, pas besoin d'alourdir avec des @try. Pouvoir envoyer des messages à nil diminue beaucoup le nombre de tests ! Je m'explique :
Ce n'est pas un "non sens", ça permet d'avoir des constructeurs virtuels !
Maintenant, je crois quand même que je comprends ton avis : au moins en C++, si ça compile pas, on sait pourquoi. Alors qu'en Objective-C, si ça marche pas, on cherche un moment pour savoir d'où ça vient. La rigueur du C++ est un atout, la souplesse de l'Objective-C une source de problèmes autant qu'elle est pratique. Dur dur d'avoir le meilleur des deux !
+
Chacha
Pour ne pas laisser la mémoire dans un état incertain au niveau du premier @try rencontré.
Vu qu'il est précisé que si on code sa propre fonction init avec un paramètre, on redéfinie la fonction init comme indiquée pour le cas ou on diffuse sa classe.
Si l'utilisateur n'en tient pas compte ça dealloc et envoie un message sur la console pour signaler, une alerte eu probablement été un +...
J'ai bon ?
Si elle n'est pas "catchée" ou à l'intérieur d'un événement traité par la boucle d'événements, ça fait planter tout le programme.
Si c'est à l'intérieur d'un événement (IBAction par exemple), ça l'annihile complètement.
et son site est la :http://www.cocoa.fr/
En cas de questions...
Il y a un lien sur un site fameux sur la page:
http://www.pearson.fr/livre/?GCOI=27440100726260
Rubrique compléments
:fouf):
Une explication ? je pensais que l'outlet était réservé au objet IB pour être connecté a la classe...
Le terme Outlet delegate me choque aussi...
vos avis seront les bienvenus...
Pour qu'une ivar deviennent un outlet, il faut soit que IBOutlet soit écrit juste avant le nom du type de l'ivar, ou alors que l'ivar soit de type "id".
Ce qu'il fait que "delegate" et "datasource" sont des outlets, la preuve en est c'est que tu peux les faire référencer des objets graphiquement via IB.
Après tout, des IBOutlets ne sont rien d'autre que des variables d'instances comme les autres (si ce n'est qu'elles sont en plus visibles dans IB) donc tu peux les utiliser comme les autres variables d'instance (ou préférer IB)
J'aimerais bien que tu me trouves ne serait-ce qu'une seule classe qui définisse un delegate ou un datasource en tant qu'IBOutlet...
Personnellement, je n'ai jamais vu de déclaration comme ça : IBOutlet id _delegate ou IBOutlet id _dataSource...
AMHA c'est plus compliqué que ça...
Par exemple :
Déjà dans IB, on ne voit pas "_delegate" mais "delegate" et pas "_dataSource", mais "dataSource"...
Et ensuite, on ne voit pas "_reserved"
Alors peut-être que _delegate et _datasource ont un traitement de faveur, mais je peux te garantir que n'importe quelle variable d'instance de type id dont le nom ne commence pas par _ va être reconnue par IB, avec ou sans IBOutlet, et c'est écrit dans la norme.
Et en fait non, delegate et datasource n'ont pas de réel traitement de faveur, en fait s'ils sont visibles alors qu'ils ont l'underscore c'est sûrement parce que ces objets sont configurés comme ça dans les plugins IB.
Il doit y avoir des noms de variables d'instance réservés qui sont automatiquement IBOutlets
Il suffit de mettre [tt]id delegate[/tt] dans une classe et hop elle est visible dans IB comme si on avait mis IBOutlet devant
Et d'ailleurs, ce comportement est documenté...