86 votes

Comment Objective-C se compare-t-il à C #?

J'ai récemment acheté un Mac et l'utiliser principalement pour développement C# sous VMWare Fusion. Avec toutes les belles applications Mac autour de moi, je ai commencé à penser à Xcode se cache juste installer un clic de souris, et l'apprentissage Objective-C.

La syntaxe entre les deux langues est très différente, sans doute parce que l'Objective-C a ses origines dans le C et le C# a ses origines en Java/C++. Mais les différentes syntaxes peuvent être appris, de sorte que devrait être OK.

Ma principale préoccupation est de travailler avec la langue, et si cela peut aider à produire bien structuré, lisible et élégante code. J'ai vraiment profiter de fonctionnalités telles que LINQ et var en C# et je me demande si il y a des équivalents ou mieux/caractéristiques différentes en Objective-C.

Quelles fonctionnalités de la langue vais-je manquer développement Objective-C? Quelles sont les caractéristiques que j'ai à y gagner?

Edit: Le cadre de comparaisons sont utiles et intéressantes, mais une langue à la comparaison de ce que cette question est vraiment se poser (en partie de ma faute pour à l'origine de marquage à l'aide de .net). Sans doute le Cacao et le .NET sont très riches cadres dans leur propre droit, et les deux ont leur but, l'un ciblant Mac OS X et l'autre Windows.

Je vous remercie pour le bien pensée et raisonnablement équilibrée des points de vue à ce jour!

89voto

Quinn Taylor Points 29688

Aucune langue n'est parfait pour toutes les tâches, et de l'Objective-C n'est pas une exception, mais il y a certaines subtilités. Comme à l'aide d' LINQ et var (pour lequel je ne suis pas au courant d'un remplacement direct), certaines sont strictement liés à la langue, et d'autres sont cadre.

(REMARQUE: tout comme le C# est étroitement couplé avec .NET, Objective-C est étroitement couplé avec le Cacao. Ainsi, certains de mes points peuvent sembler sans rapport avec Objective-C, mais Objective-C sans Cacao est semblable à C# sans .NET / WPF / LINQ, fonctionnant sous Mono, etc. C'est juste pas la façon dont les choses sont habituellement effectuées.)

Je ne prétends pas avoir à préciser les différences, avantages et inconvénients, mais voici quelques-uns qui sautent à l'esprit.

  • Une des meilleures parties de l'Objective-C est la dynamique de la nature plutôt que de l'appel de méthodes, de vous envoyer des messages, de l'exécution des itinéraires de manière dynamique. Combiné (judicieusement) avec typage dynamique, cela peut faire beaucoup de puissants modèles simple ou encore trivial à mettre en œuvre.

  • Comme un sur-ensemble strict de C, Objective-C approbations que vous savez ce que vous faites. Contrairement à la gestion et/ou de typesafe approche des langages tels que le C# et Java, Objective-C permet de faire ce que vous voulez et en subissent les conséquences. Évidemment, cela peut être dangereux à la fois, mais le fait que la langue n'a pas réellement vous empêcher de faire la plupart des choses est assez puissant. (EDIT: je me dois de préciser que le C# a aussi "dangereux" caractéristiques et de fonctionnalités, mais ils le comportement par défaut est le code managé, qui vous ont explicitement refuser de. Par comparaison, Java seulement permet de typesafe code, et de ne jamais expose raw pointeurs dans la façon dont C et d'autres.)

  • Catégories (ajout/modification des méthodes d'une classe sans sous-classement ou d'avoir accès à la source) est une impressionnante épée à double tranchant. Il peut grandement simplifier les hiérarchies d'héritage et de supprimer le code, mais si vous faites quelque chose d'étrange, les résultats peuvent parfois être déroutant.

  • Cacao facilite la création d'applications à interface graphique beaucoup plus simple dans beaucoup de façons, mais vous ne devez envelopper votre tête autour du paradigme. MVC design est omniprésent dans le Cacao, et les motifs tels que des délégués, les notifications, et multi-thread GUI apps sont bien adaptés à l'Objective-C.

  • Cocoa bindings et clé-valeur de l'observation peut éliminer des tonnes de colle le code et le Cacao cadres de tirer parti de cette profondeur. Objective-C est la distribution dynamique travaille main dans la main avec ce, donc le type de l'objet n'a pas d'importance tant qu'il est la clé-valeur conforme.

  • Vous aurez probablement manquer les génériques et les espaces de noms, et ils ont leurs avantages, mais dans l'Objective-C mentalité et de paradigme, ils seraient subtilités plutôt que des produits de première nécessité. (Les génériques sont toutes sur le type de sécurité et d'éviter le moulage, mais typage dynamique en Objective-C fait c'est essentiellement un non-problème. Les espaces de noms serait sympa si c'est bien fait, mais il est assez simple d'éviter les conflits que le coût sans doute l'emportent sur les avantages, en particulier pour le code de legs.)

  • Pour la concurrence, de Blocs (une nouvelle fonctionnalité dans Snow Leopard, et mis en œuvre dans les scores de Cacao Api) sont extrêmement utiles. Quelques lignes (souvent couplé avec de Grand Central Dispatch, qui fait partie de libsystem sur 10.6) peut élimine significative passe-partout de fonctions de rappel (callback, context, etc. (Les blocs peuvent aussi être utilisés en C et C++, et pourrait certainement être ajouté à C#, ce qui serait génial.) NSOperationQueue est aussi un moyen très pratique pour ajouter de la simultanéité à votre propre code, par l'envoi personnalisé NSOperation sous-classes ou des blocs anonymes qui PGCD exécute automatiquement sur un ou plusieurs threads différents pour vous.

54voto

Waz Points 545

J'ai été à la programmation en C, C++ et C# maintenant plus de 20 ans, a d'abord commencé en 1990. J'ai juste décidé d'avoir un regard sur le développement iPhone et Xcode et Objective-C. Oh mon dieu... toutes les plaintes à propos de Microsoft je reprends, je me rends compte maintenant comment les mauvaises choses de code ont été. Objective-C est plus complexe par rapport à ce que le C#. J'ai été gâté avec C# et maintenant, j'apprécie tout le travail de Microsoft ont mis en. La simple lecture Objective-C avec la méthode invoque est difficile à lire. C# est élégante dans cette. C'est juste mon avis, j'espère que la Pomme de développement de la langue était un bon, comme les produits Apple, mais cher moi, ils ont beaucoup à apprendre de Microsoft. Il n'est pas question C#.NET application je peux obtenir une application et l'exécution de plusieurs fois plus rapide que XCode, Objective-C. Apple devrait certainement prendre une feuille de Microsoft livre ici, et nous aurions l'environnement parfait. :-)

45voto

TimothyP Points 6043

Aucune revue technique ici, mais j’ai juste trouver Objective-C beaucoup moins lisible. Compte tenu de l’exemple Cinder6 vous a donné :

C#

Objective-C

C’est horrible. J’ai même essayé de lire 2 livres à ce sujet, ils ont perdu moi dès le début, et normalement je n’obtiens qu’avec des livres de programmation / langues.

Je suis heureux que nous avons Mono pour Mac OS, parce que si j’avais eu à compter sur Apple pour me donner un bon environnement de développement...

17voto

PeyloW Points 25312

Manuel de gestion de la mémoire est quelque chose de débutants à Objective-C semble avoir plus de problème avec, principalement parce qu'ils pensent qu'il est plus complexe qu'elle ne l'est.

Objective-C et Cocoa par extension s'appuie sur les conventions de mise en application; de connaître et de suivre un très petit ensemble de règles et que vous obtenez beaucoup pour gratuitement par la dynamique d'exécution en retour.

La pas 100% fidèle à la règle, mais assez bon pour tous les jours:

  • Chaque appel à l' alloc devrait être mis en correspondance avec un release à la fin du présent champ d'application.
  • Si la valeur de retour de votre méthode a été obtenue en alloc alors qu'il devrait être renvoyé par return [value autorelease]; , au lieu d'être accompagnés par l' release.
  • Utiliser les propriétés, et il n'y a pas de règle de trois.

Une longue explication de la façon suivante.

Gestion de la mémoire est basée sur la propriété; seul le propriétaire d'un objet instance doit jamais lâcher l'objet, tout le monde reste à faire toujours rien. Cela signifie que dans plus de 95% de tous les code que vous traiter Objective-C comme si c'était des ordures collectées.

Alors, les autres 5%? Vous disposez de trois méthodes pour regarder dehors pour, toute instance de l'objet reçu de ces méthode sont détenus par le courant de la portée de la méthode:

  • alloc
  • La méthode, à partir des mots nouveaux, tels que l' new ou newService.
  • Toute méthode contenant le mot copie, comme copy et mutableCopy.

La méthode disposez de trois options possibles comme de quoi faire avec c'est la propriété des instances de l'objet avant de sortir:

  • La libération à l'aide de release si elle n'est plus nécessaire.
  • Donner la possession de l'un champ (variable d'instance), ou une variable globale par simple attribution.
  • Renoncer à la propriété, mais donner à quelqu'un d'autre une chance de prendre possession avant que l'instance va plus loin en appelant autorelease.

Alors, quand devriez-vous pro-activement prendre possession en appelant retain? Deux cas de figure:

  • Lors de l'attribution des champs dans votre initialiseurs.
  • Quand manuellement la mise en œuvre de méthode d'initialisation.

10voto

user561168 Points 123

Bien sûr, si tout ce que vous avez vu dans votre vie est Objective C, puis sa syntaxe ressemble à la seule possible. On peut vous appeler programmation "vierge".

Mais depuis beaucoup de code est écrit en C, C++, Java, JavaScript, Pascal et d'autres langues, vous verrez que ObjectiveC est différent de tous les d'eux, mais pas dans le bon sens. Avaient-ils une raison pour cela? Nous allons voir d'autres langues populaires:

C++ ajouté beaucoup d'extras à C, mais il a changé la syntaxe d'origine seulement autant que nécessaire.

C# a ajouté beaucoup d'extras par rapport à C++, mais ça a changé des choses qui étaient laids en C++ (comme retirer les "::" à partir de l'interface).

Java a changé beaucoup de choses, mais elle a gardé la syntaxe familière, sauf dans certaines régions où le changement est nécessaire.

JavaScript est une dynamique de la langue qui peut faire beaucoup de choses ObjectiveC ne le peuvent pas. Encore, ses créateurs n'a pas inventé une nouvelle façon de l'appel de méthodes et passage de paramètres, juste pour être différent du reste du monde.

Visual Basic permet de transmettre des paramètres de commande, tout comme ObjectiveC. Vous pouvez nommer les paramètres, mais vous pouvez également les transmettre de la façon habituelle. Tout ce que vous utilisez, il est normal délimité par des virgules façon que tout le monde comprenne. La virgule est le séparateur d'habitude, et pas seulement dans les langages de programmation, mais dans les livres, les journaux, et la langue écrite en général.

Pascal objet a une syntaxe différente de C, mais sa syntaxe est en fait plus FACILE à lire pour le programmeur (peut-être pas à l'ordinateur, mais qui se soucie de ce que l'ordinateur pense). Donc peut-être qu'ils digression, mais au moins, leur résultat est meilleur.

Python a une syntaxe différente, ce qui est encore plus facile à lire (pour les humains) que Pascal. Alors, quand ils l'ont changé, rendant différent, au moins ils ont fait de mieux pour nous les programmeurs.

Et puis nous avons ObjectiveC. L'ajout de quelques améliorations à C, mais d'inventer sa propre interface de la syntaxe, de l'appel de méthode, passage de paramètres et de ce pas. Je me demande pourquoi ils n'ont pas de swap + et - de sorte que plus de la soustraction de deux nombres. Il aurait été encore plus cool.

Steve Jobs vissé vers le haut en appuyant ObjectiveC. Bien sûr, il ne peut pas supporter C#, ce qui est mieux, mais appartient à son pire concurrent. C'est donc une décision politique, pas une pratique. Technologie toujours souffre de la tech des décisions sont prises pour des raisons politiques. Il devrait diriger l'entreprise, qu'il fait bon, et quitter la programmation des questions à des experts.

Je suis sûr qu'il y aurait encore plus d'apps pour iPhone, si il a décidé d'écrire iOS et bibliothèques de prise en charge dans une autre langue que l'ObjectiveC. Pour tout le monde sauf les die-hard fans, vierge de programmeurs et de Steve Jobs, ObjectiveC l'air ridicule, laid et repoussant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X