petite question sur Objective-C

mathusalem

Membre actif
29 Mai 2006
368
28
Paris
grin.developpez.com
Bonjour à tous !


J'ai rapidement pourcouru un tuto sur OC et une question me vient :

quelle différence entre l'envoie de message à la OC
Bloc de code:
[objet methode param]

et la façon de faire à la java / python / ruby / c++ etc.
Bloc de code:
objet.methode(param)


la différence est-elle uniquement dans la syntaxe ? Je ne me souviens pas dans mon apprentissage du java, avoir un jour été confronté au concept de message.


Merci !
 
Oui, c'est principalement la syntaxe.
 
Une différence essentielle par rapport au C++ (pour les autres langages, je ne sais pas):

Tu peux envoyer n'importe quel message à un objet. S'il est capable de répondre à la méthode, il y répondra.
Par exemple, il existe un type id qui est universel et peut désigner tout objet. Tu peux appeler n'importe quel méthode, et c'est à l'exécution que le "Runtime" vérifiera que l'objet est effectivement capable d'y répondre . En C++, il faudra typer cet objet pour que le compilateur vérifie la disponibilité de cette méthode.

En ce sens, ObjC est beaucoup plus souple.
 
Une efficacité de l'objective-c tient dans le nommage des étiquettes:

[nomInstance doSomethingWith: fromObject: ]

Si tu reviens étudier ton code une semaine plus tard, tu ne perds pas ton temps à rechercher le rôle fondamentale de tes méthodes puisqu'elles sont explicites.

Un procédé facile pour complexifier du code consiste à utiliser un ensemble d'instance, puis au nouveau cycle de réalisation, d' utiliser 'retain/release' sur chacune de ces instances.
 
claw59 a dit:
Une efficacité de l'objective-c tient dans le nommage des étiquettes:

[nomInstance doSomethingWith: fromObject: ]

Si tu reviens étudier ton code une semaine plus tard, tu ne perds pas ton temps à rechercher le rôle fondamentale de tes méthodes puisqu'elles sont explicites.

ce n'est pas plutôt en rapport avec le nom que tu donnes à tes méthodes ?

claw59 a dit:
Un procédé facile pour complexifier du code consiste à utiliser un ensemble d'instance, puis au nouveau cycle de réalisation, d' utiliser 'retain/release' sur chacune de ces instances.

je ne sais pas ce qu'est retain / release, j'ai rien compris :rose:
mais ce n'est pas bien grave :D


merci de ta réponse.
 
Sous objective-c une méthode se décompose en 2 parties : un label et un type

'retain/release' consiste à instancier de manière homogène une instance sur une instance, pour modifier cet état de fait durant l'exécution (parce que le typage est dynamique), le procédé identique concernant des types hétérogènes concernent l'utiliser des 'NSZone' et en particulier la méthode 'allocWithZone' inscrit dans les 'NSObject'.
 
mathusalem a dit:
ce n'est pas plutôt en rapport avec le nom que tu donnes à tes méthodes ?
En fait, son exemple n'est pas très bon, même si en effet, c'est un avantage. Prenons l'exemple de la classe NSColor, qui contient une couleur.

Pour initialiser une instance en ObjC:
[myColor initWithCalibratedRed:0.7 green:0.5 blue:0.3];

En C++, ça donnerait quelque chose comme ça:
myColor.initWithCalibratedLevels(0.7, 0.5, 0.3);


La première version est plus lisible, c'est un héritage de SmallTalk (historiquement le premier langage objet, et la première source d'inspiration d'ObjC).

Remarque que c'est également la manière dont ObjC implémente le polymorphisme.



P.S.: Rien compris à ces histoires de retain / release non plus.
 
mathusalem a dit:
ce n'est pas plutôt en rapport avec le nom que tu donnes à tes méthodes ?



je ne sais pas ce qu'est retain / release, j'ai rien compris :rose:
mais ce n'est pas bien grave :D


merci de ta réponse.
retain ca retient un objet* en memoire
release -> free(an object)


Pour initialiser une instance en ObjC:
[myColor initWithCalibratedRed:0.7 green:0.5 blue:0.3];

cela a aussi inspiré des languages comme python ou Ruby
avec toutefois une présentation explicite optionnelle



mal lu