J'espérais faire une liste de certaines des différences entre Java et l'objectif C d'abeille ma confusion. Cela facilite l'explication de mes difficultés quand je sais ce que les choses sont appelées. P>
Par exemple: P>
Ce que je recherche, ce sont des comparaisons similaires ou des corrections à ceux que j'ai énumérées. Pas seulement limité aux éléments de la langue, mais aussi des concepts ... p>
7 Réponses :
Interface = Protocole p>
= Champ variable d'instance ( "Ivar") p>
ArrayList = Array p>
appeler une méthode = envoyer un message p>
Ceux que vous avez mentionnés sont corrects. P>
Vous avez raison sur la carte = Dictionnaire. J'ajouterai: p>
Heureux que vous ayez signalé la différence entre ID code> et nsObject code> et comment les classes n'hérent pas de nsObject code> automatiquement.
Les méthodes de classe sont fondamentalement différentes des méthodes statiques, car les méthodes de classe sont expédiées de manière dynamique et peuvent être remplacées par des sous-classes. L'équivalent le plus proche d'une méthode statique est une fonction C droite. NsObject n'est pas la classe de base i>, c'est une classe de base i> i>. L'alternative la plus courante est la nsproxy. Oh, et il y a aussi nsset et nscoundset. :-)
+1 pour la pointe sur conceptualisant alloc / init. Expliquer l'idiome aux développeurs d'autres langues est toujours un peu difficile. Et merci d'avoir recommandé CHDATRACUCTURRES - Je suis content de les gens comme ça! :-)
J'ai un boeuf avec le point "alloc = nouveau" et "init = constructeur". Voir ma réponse à propos de Alloc et d'init.
J'ai lu "[[[CLASS ALLOC] init]" peut être écrit comme "[CLASSE NEW]", non?
éteint le dessus de ma tête: p>
FOO code> / setfoo code> plutôt que getfoo code > / setfoo code>.) li>
- Un écouteur d'action / bouton / souris / événement est approximativement équivalent à un
ibaction code>, bien que la façon dont Guis soit conçue dans le cacao est assez différent de Java. Li>
- au lieu d'une seule classe code> Bloc, les définitions de classes sont définies par un
@interface code> (pour les variables d'instance et les déclarations de méthode) et un @Implementatation code> (pour le code de méthode réel) Directive. Li>
ul> Bien que l'archivage clé soit beaucoup plus robuste que la plupart des solutions de sérialisation en Java. :-)
Une autre différence conceptuelle est le comportement lorsque vous appelez des méthodes (envoyant des messages) sur des objets NULL (à nul).
Java strong> p> id myObject = nil;
[myObject doSomething]; <-- is valid
Remarque: vous obtenez seulement une nullpointerException si "DOSMATHIGH" n'est pas statique.
au lieu d'utiliser des itérateurs pour une énumération facile, vous utilisez généralement, pour les classes qui implémentent le protocole de fixation de la fixation (interface en Java), un simple p>
pour (class * élément dans le conteneur) p>
http://developer.apple.com/documentation /Cocoa/conceptual/objectivec/articles/ocfastenumage.html P>
Depuis Java 1.5, il y a un pour (élément de classe: conteneur) code> construction qui fonctionne sur tout ce qui implémente iTrable.
réponses précédentes couvrent la plupart des différences de « phrasebook », mais il y a plusieurs différences conceptuelles clés qui méritent d'être mentionnés ... (Notez que je ne mentionne que pures questions Objective-C, pas de cacao.) P>
Une réponse philosophique à propos de Alloc / init.
init n'est pas un constructeur. Conceptuellement, "construction" n'existe pas dans l'objectif-c. En Java (et d'autres langues avec des constructeurs), appeler le constructeur retournera une nouvelle instanciation de l'objet prêt à partir. il n'y a pas d'équivalent exact à cela dans l'objectif-c em>. (On pourrait affirmer que les méthodes de la classe de commodité telles que la matrice + + TaryWithObjects, etc. sont des constructeurs techniquement, car ils enveloppent à la fois l'allocation et l'initialisation, mais je dirais qu'ils ne sont toujours pas des constructeurs au même sens que les constructeurs Java.) P> Ce que nous avons à la place est le concept d'allocation et d'initialisation, deux étapes distinctes qui, lorsqu'elles sont exécutées ensemble, agissent comme s'il s'agissait d'un "constructeur". La méthode de classe + ALLOC demande simplement une pièce de mémoire de taille appropriée du système. IIRC, il utilise la fonction calloc () pour le faire. Il n'est pas garanti que tout soit à zéro aura lieu pendant l'exécution de la fonction Alloc. Cela signifie que nous devons faire l'initialisation de nous-mêmes, que nous faisons par immédiatement em> appelant une méthode -Il. P> Cependant, - et tous les dérivés) ne sont rien de plus que l'ordinaire Méthodes d'instance. Vous pouvez les envoyer à chaque fois que vous le souhaitez afin de "réinitialiser" une instance d'objet à son état initial initial (bien qu'il existe certaines ramifications de la gestion de la mémoire de faire cela qui doit être prise en compte). Cela signifie également que vous pouvez faire quelque chose de ridicule comme celui-ci: P> - (id) initWithCapacity:(NSUInteger)initialCapacity {
if (self = [super init]) {
[self setInitialCapacity:initialCapacity];
}
return self;
}
- (id) init {
return [self initWithCapacity:0];
}
C'était très utile. Merci!
Je reste derrière ma comparaison. Le nouvel opérateur agit sémantiquement comme un allocator et le constructeur en tant qu'indemizeur. Les constructeurs n'allouent pas de mémoire non plus - ils obtiennent des objets prêts à partir, tout comme les méthodes init font. Oui, les détails diffèrent (et j'ai appris certaines choses de votre message), mais à attendre que ce soit des langues très différentes. Cela ne signifie pas que la comparaison est sans valeur.
De plus, je envisage des méthodes de commodité telles que + TarywithObjects pour être plus proches des méthodes d'usine Java que des constructeurs Java. :)
Techniquement
nil code> et Cnull code> constante est la même chose (0), mais oui, les programmeurs de l'objectif-C utilisent généralementnil code> pour les pointeurs d'objet.