¿Cómo se compara Objective-C con C #? [cerrado]

87

Recientemente compré una Mac y la uso principalmente para el desarrollo de C # en VMWare Fusion. Con todas las buenas aplicaciones para Mac, comencé a pensar en Xcode acechando con solo un clic de instalación y aprendiendo Objective-C.

La sintaxis entre los dos lenguajes se ve muy diferente, presumiblemente porque Objective-C tiene sus orígenes en C y C # tiene sus orígenes en Java / C ++. Pero se pueden aprender diferentes sintaxis, por lo que debería estar bien.

Mi principal preocupación es trabajar con el lenguaje y si ayudará a producir un código bien estructurado, legible y elegante. Realmente disfruto de características como LINQ y var en C # y me pregunto si hay equivalentes o características mejores / diferentes en Objective-C.

¿Qué características del lenguaje extrañaré desarrollar con Objective-C? ¿Qué características obtendré?

Editar: Las comparaciones de marcos son útiles e interesantes, pero una comparación de idiomas es lo que realmente está preguntando esta pregunta (en parte es mi culpa por etiquetar originalmente .net). Presumiblemente, tanto Cocoa como .NET son marcos muy ricos por derecho propio y ambos tienen su propósito, uno dirigido a Mac OS X y el otro a Windows.

¡Gracias por los puntos de vista bien pensados ​​y razonablemente equilibrados hasta ahora!

Alex Angas
fuente
27
Xcode no es perfecto, pero ciertamente tiene muchas funciones poderosas y útiles. Despreciar algo como "pura maldad" sin respaldarlo o proporcionar un contexto para la comparación es FUD que no ayuda a nadie. En cualquier caso, es irrelevante para la pregunta.
Quinn Taylor
11
Xcode 3.2 es posiblemente el mejor IDE que he usado, con su elegante manejo de puntos de interrupción, análisis estático, mensajes de error en línea y muchas otras características. Por cierto, es "Xcode" y no "XCode". @Nathan, realmente no veo por qué necesitas denigrar Xcode llamándolo "pura maldad", sin ninguna justificación, en una discusión sobre idiomas.
PlagueHammer
6
Una gran cosa que obtendrá al usar Objective-C es que tendrá acceso a los marcos de Cocoa. Además, C, C #, Java y C ++ comparten una herencia sintáctica común. Objective-C obtiene su sintaxis de Smalltalk.
Amok
4
¿Trabaja en C # usando VMWare Fusion? Simplemente use mono y monodevelop (que es una versión de código abierto de .NET y Visual Studio que funciona en Mac y Linux. Con Mono también puede crear aplicaciones para Mac y iPhone usando C # mientras también usa la biblioteca .NET, así como Cocoa ...
Robin Heggelund Hansen
5
@ user668039 ¿15 años de experiencia en el uso de C #? ¡Fue lanzado en 2001!
Ian Newson

Respuestas:

89

Ningún lenguaje es perfecto para todas las tareas y Objective-C no es una excepción, pero hay algunas sutilezas muy específicas. Como usar LINQy var(para el cual no tengo conocimiento de un reemplazo directo), algunos de estos están estrictamente relacionados con el lenguaje y otros están relacionados con el marco.

( NOTA: así como C # está estrechamente acoplado con .NET, Objective-C está estrechamente acoplado con Cocoa. Por lo tanto, algunos de mis puntos pueden parecer no relacionados con Objective-C, pero Objective-C sin Cocoa es similar a C # sin .NET / WPF / LINQ, ejecutándose en Mono, etc. Simplemente no es la forma en que normalmente se hacen las cosas).

No pretendo explicar completamente las diferencias, los pros y los contras, pero aquí hay algunos que me vienen a la mente.

  • Una de las mejores partes de Objective-C es la naturaleza dinámica: en lugar de llamar a métodos, usted envía mensajes, que el tiempo de ejecución enruta dinámicamente. Combinado (juiciosamente) con la escritura dinámica, esto puede hacer que muchos patrones poderosos sean más simples o incluso triviales de implementar.

  • Como un superconjunto estricto de C, Objective-C confía en que usted sabe lo que está haciendo. A diferencia del enfoque administrado y / o seguro de tipos de lenguajes como C # y Java, Objective-C le permite hacer lo que quiera y experimentar las consecuencias. Obviamente, esto puede ser peligroso a veces, pero el hecho de que el lenguaje no te impida activamente hacer la mayoría de las cosas es bastante poderoso. ( EDITAR: Debo aclarar que C # también tiene características y funcionalidades "inseguras", pero su comportamiento predeterminado es el código administrado, que debe excluirse explícitamente. En comparación, Java solo permite el código de seguridad de tipos y nunca expone punteros sin formato en como lo hacen C y otros).

  • Las categorías (agregar / modificar métodos en una clase sin subclasificar o tener acceso a la fuente) es un arma de doble filo increíble. Puede simplificar enormemente las jerarquías de herencia y eliminar el código, pero si hace algo extraño, los resultados a veces pueden ser desconcertantes.

  • Cocoa hace que la creación de aplicaciones GUI sea mucho más simple de muchas maneras, pero tienes que entender el paradigma. El diseño MVC es omnipresente en Cocoa, y los patrones como delegados, notificaciones y aplicaciones GUI de subprocesos múltiples se adaptan bien a Objective-C.

  • Las uniones de Cocoa y la observación de valores clave pueden eliminar toneladas de código de pegamento, y los marcos de Cocoa aprovechan esto ampliamente. El envío dinámico de Objective-C trabaja de la mano con esto, por lo que el tipo de objeto no importa siempre que sea compatible con el valor clave.

  • Es probable que extrañe los genéricos y los espacios de nombres, y tienen sus beneficios, pero en la mentalidad y el paradigma de Objective-C, serían sutilezas en lugar de necesidades. (Los genéricos tienen que ver con la seguridad de tipos y evitar la conversión, pero la escritura dinámica en Objective-C hace que esto sea esencialmente un problema. Los espacios de nombres serían agradables si se hicieran bien, pero es lo suficientemente simple para evitar conflictos que el costo posiblemente supere los beneficios, especialmente para código heredado.)

  • Para la simultaneidad, Blocks (una nueva característica de lenguaje en Snow Leopard e implementada en decenas de API de Cocoa) son extremadamente útiles. Unas pocas líneas (con frecuencia combinadas con Grand Central Dispatch, que es parte de libsystem en 10.6) pueden eliminar un texto repetitivo significativo de funciones de devolución de llamada, contexto, etc. (Los bloques también se pueden usar en C y C ++, y ciertamente podrían agregarse a C #, lo cual sería increíble.) NSOperationQueue también es una forma muy conveniente de agregar simultaneidad a su propio código, enviando subclases personalizadas de NSOperation o bloques anónimos que GCD ejecuta automáticamente en uno o más subprocesos diferentes para usted.

Quinn Taylor
fuente
7
Técnicamente, C # tiene todo el poder no con seguridad de características que hace ObjC: punteros primas, la aritmética de punteros, arrays con destino a sin marcar, los sindicatos, alloca. Simplemente no los hace tan accesibles; debe optar por participar explícitamente.
Pavel Minaev
8
Simplemente menciono Cocoa porque la mayor parte del atractivo de la programación en Objective-C se debe a los marcos de Cocoa. ¿C # sería interesante sin .NET y / o WPF? El autor de la pregunta mencionó específicamente LINQ, por lo que obviamente está mirando más allá del idioma, hacia la experiencia.
Quinn Taylor
7
Lo cual está bien. No estoy tratando de pelear con C #. Si tuviera que escribir software de Windows, eso es lo que usaría. Simplemente intento señalar similitudes y diferencias entre los lenguajes y las herramientas relacionadas. Obviamente, tienes más experiencia con C # y yo con Objective-C. Agradezco sus aclaraciones, pero quizás las respuestas más constructivas y menos cortes de cabello sean más útiles.
Quinn Taylor
11
No es un corte de pelo, Quinn. Simplemente señalé que lo que comenzó como una comparación de idiomas se convirtió en una discusión general sobre cómo Cocoa es bueno en algún momento de su respuesta. Todavía me gustaría señalar que sus puntos sobre Cocoa no son comparaciones , dicen "lo hace X bien", y puede ser el caso, pero no dicen "lo hace X mejor / peor que C # + WPF ", que es de lo que trata la pregunta en general.
Pavel Minaev
6
+1 excelente respuesta Quinn
h4xxr
54

He estado programando en C, C ++ y C # por más de 20 años, comencé en 1990. Acabo de decidir echar un vistazo al desarrollo de iPhone y Xcode y Objective-C. Oh Dios mío ... todas las quejas sobre Microsoft las retiro, ahora me doy cuenta de lo mal que ha estado el código. Objective-C es demasiado complejo en comparación con lo que hace C #. Me han echado a perder con C # y ahora aprecio todo el arduo trabajo que ha realizado Microsoft. Simplemente leer Objective-C con invocaciones de métodos es difícil de leer. C # es elegante en esto. Esa es solo mi opinión, esperaba que el lenguaje de desarrollo de Apple fuera tan bueno como los productos de Apple, pero querida, tienen mucho que aprender de Microsoft. No hay duda de que la aplicación C # .NET puedo poner una aplicación en funcionamiento muchas veces más rápido que XCode Objective-C. Apple ciertamente debería tomar una hoja del libro de Microsoft aquí y entonces tendríamos el entorno perfecto. :-)

Waz
fuente
47
Aunque haya echado un vistazo a un libro de desarrollo de iPhone, ¿aún puede crear una aplicación más rápido en una plataforma en la que tiene 20 años de experiencia? AMAZING
kubi
25
Estoy teniendo exactamente la misma experiencia que Waz. También estoy mucho más agradecido por el trabajo que Microsoft ha realizado en C # y las herramientas de desarrollo como Visual Studio, después de que comencé a aprender el Objetivo C.
René
4
Esa también fue mi experiencia mientras estudiaba el objetivo-c, el exceso de complejidad en comparación con c #. @ alexy13 ¿Qué parte de c y c ++ del mensaje original te has perdido? Tener décadas de experiencia en una familia de idiomas ayuda MUCHO a evaluar qué tan difícil es hacer el mismo trabajo con otro idioma de la misma familia.
Anderson Fortaleza
5
¿Cómo es esta respuesta principal? no es una respuesta concisa, solo una opinión claramente sesgada de un idioma que aprendió de la noche a la mañana en comparación con un idioma que ha estado usando durante 20 años ... obviamente no
dominará tanto
3
"Just reading Objective-C with method invokes is difficult to read"- Aquí hay solo un argumento muy subjetivo que se menciona aquí como contras de Obj-C. Todo lo demás es solo retórica discutible.
skywinder
46

No hay revisión técnica aquí, pero creo que Objective-C es mucho menos legible. Dado el ejemplo que le dio Cinder6:

C#

List<string> strings = new List<string>();
strings.Add("xyzzy");                  // takes only strings
strings.Add(15);                       // compiler error
string x = strings[0];                 // guaranteed to be a string
strings.RemoveAt(0);                   // or non-existant (yielding an exception)

C objetivo

NSMutableArray *strings = [NSMutableArray array];
[strings addObject:@"xyzzy"];
[strings addObject:@15];
NSString *x = strings[0];
[strings removeObjectAtIndex:0];

Se ve horrible. Incluso intenté leer 2 libros sobre él, me perdieron al principio, y normalmente no lo entiendo con los libros / lenguajes de programación.

Me alegro de que tengamos Mono para Mac OS, porque si tuviera que confiar en Apple para que me diera un buen entorno de desarrollo ...

TimothyP
fuente
17
Ignorando el hecho de que la 1ª línea debería terminar con [NSMutableArray array](está perdiendo memoria) y la 4ª línea debería empezar con NSString* xo id x(error de compilación) ... Sí, Objective-C carece de genéricos (honestamente, no los extraño), no indexa objetos con sintaxis de matriz, y las API son generalmente más detalladas. To-may-to, to-mah-to. Realmente se reduce a lo que prefieres ver. (Podrías escribir el mismo código en C ++ STL y creo que es horrible). Para mí, el código legible a menudo significa que el texto del código te dice lo que está haciendo y, por lo tanto, es preferible el código Objective-C.
Quinn Taylor
18
Realmente no encuentro nada malo con la sintaxis como tal; la razón principal por la que se siente menos legible es porque 1) no es familiar para todos los que provienen del fondo C, y 2) se usa en medio de construcciones C simples, donde parece extraño. Por otro lado, Smalltalkish named-parameters-as-part-of-method-name en realidad hace que las llamadas sean más comprensibles desde el principio. De hecho, su ejemplo de código C # lo demuestra bien: no se compilará, porque List<T>.Removetoma una cadena como argumento y elimina la primera aparición de esa cadena. Para eliminar por índice, necesita RemoveAt.
Pavel Minaev
12
... mientras que la versión de ObjC con removeObjectAtIndex:, aunque más detallada, también es inequívoca en cuanto a lo que hace.
Pavel Minaev
6
Excelentes puntos, Pavel. Además, la inconsistencia entre strings[0]y strings.RemoveAt(0)resta valor a la claridad, al menos para mí. (Además, siempre me molesta cuando los nombres de los métodos comienzan con una letra mayúscula ... Sé que es un pequeño inconveniente, pero es simplemente extraño)
Quinn Taylor
4
En mi caso, como en el de muchas personas, la legibilidad de "la herramienta" afecta mi productividad. Me siento cómodo y productivo con muchos lenguajes Objective-C, sin embargo, nunca ha sido uno de ellos y eso no es porque no lo haya intentado. Pero nuevamente, al final del día, se trata de preferencias personales. A diferencia de hace 20 años, no estás obligado a utilizar el lenguaje X para dirigirte a la plataforma Y. Tú eliges lo que más te convenga.
TimothyP
17

La administración de memoria manual es algo con lo que los principiantes en Objective-C parecen tener más problemas, principalmente porque piensan que es más complejo de lo que es.

Objective-C y Cocoa, por extensión, se basan en convenciones sobre la aplicación; conozca y siga un conjunto muy pequeño de reglas y obtendrá mucho gratis por el tiempo de ejecución dinámico a cambio.

La regla no es 100% verdadera, pero lo suficientemente buena para todos los días es:

  • Cada llamada a allocdebe coincidir con un releaseal final del alcance actual.
  • Si el valor de retorno de su método se ha obtenido antes alloc, debería ser devuelto por en return [value autorelease];lugar de coincidir con un release.
  • Utilice propiedades, y no hay una regla tres.

Sigue la explicación más larga.

La gestión de la memoria se basa en la propiedad; solo el propietario de una instancia de objeto debería liberar el objeto, todos los demás no deberían hacer nada. Esto significa que en el 95% de todo el código se trata a Objective-C como si fuera una recolección de basura.

Entonces, ¿qué pasa con el otro 5%? Tiene tres métodos para buscar, cualquier instancia de objeto recibida de estos métodos es propiedad del alcance del método actual :

  • alloc
  • Cualquier método que comience con la palabra nuevo , como newo newService.
  • Cualquier método que contenga la palabra copia, como copyy mutableCopy.

El método tiene tres opciones posibles sobre qué hacer con sus instancias de objeto de propiedad antes de salir:

  • Suéltelo usando releasesi ya no es necesario.
  • Dar propiedad al campo a (variable de instancia) , o una variable global simplemente asignándola.
  • Renuncie a la propiedad, pero déle a otra persona la oportunidad de tomar la propiedad antes de que la instancia desaparezca llamando autorelease.

Entonces, ¿cuándo debería tomar posesión proactivamente llamando retain? Dos casos:

  • Al asignar campos en sus inicializadores.
  • Al implementar manualmente el método setter.
PeyloW
fuente
2
+1 Excelente resumen. Suena muy similar a cuando aprendí hace C años.
Alex Angas
4
Solo para aclarar, la recolección de basura es totalmente compatible con Objective-C en Mac, y no es necesario realizar ninguna administración de memoria manual. La gestión de memoria manual solo es necesaria en iOS.
PlagueHammer
3
Aún así, es bueno aprender los conceptos básicos de la administración de memoria, aunque solo sea para mejorar el rendimiento cuando lo necesite (no es necesario ejecutar la recolección de basura).
FeifanZ
3
iOS 5 introdujo ARC, eliminando la necesidad de tener que liberar manualmente el objeto asignado. Pero todavía no es tan fácil como C #. Hay que tener en cuenta que Objective-C tiene más de 20 años y ha mantenido algunos de los requisitos de los lenguajes en aquellos días: saber cuándo asignar y cuándo liberar / liberar memoria. C # ha eliminado todo esto por ti. Dicho esto, Cocoa tiene muchas API que aún no son tan accesibles en Windows Phone. Como gestos, muchos más controles cuando se trata de eventos de IU, etc.
jyavenard
10

Claro, si todo lo que vio en su vida es el Objetivo C, entonces su sintaxis parece la única posible. Podríamos llamarte "programador virgen".

Pero dado que gran parte del código está escrito en C, C ++, Java, JavaScript, Pascal y otros lenguajes, verá que ObjectiveC es diferente de todos ellos, pero no en el buen sentido. ¿Tenían alguna razón para esto? Veamos otros lenguajes populares:

C ++ agregó muchos extras a C, pero cambió la sintaxis original solo en la medida necesaria.

C # agregó muchos extras en comparación con C ++, pero solo cambió las cosas que eran feas en C ++ (como eliminar el "::" de la interfaz).

Java cambió muchas cosas, pero mantuvo la sintaxis familiar, excepto en las partes donde se necesitaba el cambio.

JavaScript es un lenguaje completamente dinámico que puede hacer muchas cosas que ObjectiveC no puede. Aún así, sus creadores no inventaron una nueva forma de llamar a métodos y pasar parámetros solo para diferenciarse del resto del mundo.

Visual Basic puede pasar parámetros fuera de orden, al igual que ObjectiveC. Puede nombrar los parámetros, pero también puede pasarlos de la forma habitual. Independientemente de lo que use, es una forma normal delimitada por comas que todos entienden. La coma es el delimitador habitual, no solo en los lenguajes de programación, sino en libros, periódicos y lenguaje escrito en general.

Object Pascal tiene una sintaxis diferente a la de C, pero su sintaxis es en realidad MÁS FÁCIL de leer para el programador (tal vez no para la computadora, pero a quién le importa lo que piense la computadora). Entonces, tal vez se desviaron, pero al menos su resultado es mejor.

Python tiene una sintaxis diferente, que es incluso más fácil de leer (para humanos) que Pascal. Entonces, cuando lo cambiaron, haciéndolo diferente, al menos lo hicieron mejor para nosotros los programadores.

Y luego tenemos ObjectiveC. Añadiendo algunas mejoras a C, pero inventando su propia sintaxis de interfaz, llamadas a métodos, paso de parámetros y otras cosas. Me pregunto por qué no intercambiaron + y - de modo que más resta dos números. Hubiera sido aún más genial.

Steve Jobs se equivocó al apoyar a ObjectiveC. Por supuesto que no puede soportar C #, que es mejor, pero pertenece a su peor competidor. Así que esta es una decisión política, no práctica. La tecnología siempre sufre cuando las decisiones tecnológicas se toman por razones políticas. Debe liderar la empresa, lo que hace bien, y dejar los asuntos de programación a verdaderos expertos.

Estoy seguro de que habría incluso más aplicaciones para iPhone si decidiera escribir iOS y admitir bibliotecas en cualquier otro idioma que no sea ObjectiveC. Para todos, excepto para los fanáticos acérrimos, los programadores vírgenes y Steve Jobs, ObjectiveC parece ridículo, feo y repulsivo.

usuario561168
fuente
3
los últimos 2 párrafos lo resumen todo
Zakos
Oh, sí, claro que la sintaxis parece ridícula, pero la joya del lenguaje Objective-C es que tiene casi el reflejo más fácil de usar de todos los lenguajes y algunas características de tiempo de ejecución realmente brillantes que hacen que varios paradigmas sean casi triviales de implementar. Por ejemplo, cuando uso Objective-C, nunca necesito preocuparme por qué tabla lineal usar (lista vinculada o vector o lo que sea) simplemente NSArrayy maneja la selección del mejor algoritmo basado en la máquina y la naturaleza de los datos.
Maxthon Chan
Entré en mi primer trabajo como programador (virgen) que implementa interfaces de usuario de la aplicación iOS en Objective-C. Todo lo que quiero por ahora (después de 3 años) es salir de esa 'isla' solitaria y aprender algo más independiente de la plataforma y, por lo tanto, más seminal. También para aprender si otros marcos también se actualizan tan rápido y con errores. ¡Oye! ¡Nueva caracteristica! - Crash ... Espero que el centro de trabajo (alemán) gaste algo de dinero para mí en tutoriales en Java y / o C ++ / C # ya que ya no quiero desarrollar para Apple sh * t.
anneblue
5

Una cosa que me encanta de aim-c es que el sistema de objetos se basa en mensajes, te permite hacer cosas realmente agradables que no podrías hacer en C # (¡al menos no hasta que admitan la palabra clave dinámica!).

Otra gran cosa acerca de escribir aplicaciones de cocoa es Interface Builder, es mucho mejor que el diseñador de formularios en Visual Studio.

Las cosas acerca de obj-c que me molestan (como desarrollador de C #) son el hecho de que tienes que administrar tu propia memoria (hay recolección de basura, pero eso no funciona en el iPhone) y que puede ser muy detallado debido a la sintaxis del selector y todos los [].

Jonnii
fuente
2
dynamicsolo lo llevará a la mitad: implementar un verdadero objeto dinámico, incluso con cosas triviales como la delegación de mensajes, es tedioso incluso en C # 4.0. Por otro lado, el precio por la flexibilidad del verdadero mensaje dinámico que pasa a la ObjC es el tipo perdido de seguridad.
Pavel Minaev
3
Vale la pena señalar que Objective-C permite optar por la escritura estática, lo que proporciona un grado mucho mayor de seguridad de tipos. Algunas personas prefieren la verificación en tiempo de compilación, otras prefieren la verificación en tiempo de ejecución. Lo bueno (en ambos idiomas) es que la elección no tiene por qué ser absoluta.
Quinn Taylor
3
El diseñador de Windows Forms no es tan bueno, pero si puede usar WPF (a partir de .NET 3.0), Expression Blend es difícil de superar ...
Nate
Puede hacer mucho de esto System.Reflectioncombinado con extensiones en C # 3.0, puede llamar a cualquier método que encuentre, pero no es el verdadero paso de mensajes, se verá como obj.PassMessage("function_name", params object[] args);para un mejor paso de mensajes integrado en el lenguaje, el método que falta al que se puede llamar en un objeto normal sería necesario.
Filip Kunc
4

Como programador que acaba de comenzar con Objective-C para iPhone, proveniente de C # 4.0, me faltan las expresiones lambda y, en particular, Linq-to-XML. Las expresiones lambda son específicas de C #, mientras que Linq-to-XML es en realidad más un contraste entre .NET y Cocoa. En una aplicación de muestra que estaba escribiendo, tenía algo de XML en una cadena. Quería analizar los elementos de ese XML en una colección de objetos.

Para lograr esto en Objective-C / Cocoa, tuve que usar la clase NSXmlParser . Esta clase se basa en otro objeto que implementa el protocolo NSXMLParserDelegate con métodos que se llaman (leer: mensajes enviados) cuando se lee una etiqueta abierta de elemento, cuando se leen algunos datos (generalmente dentro del elemento) y cuando se lee alguna etiqueta final de elemento . Debe realizar un seguimiento del estado y el estado del análisis. Y, sinceramente, no tengo idea de lo que sucede si el XML no es válido. Es genial para llegar a los detalles y optimizar el rendimiento, pero eso es mucho código.

Por el contrario, aquí está el código en C #:

using System.Linq.Xml;
XDocument doc = XDocument.Load(xmlString);
IEnumerable<MyCustomObject> objects = doc.Descendants().Select(
         d => new MyCustomObject{ Name = d.Value});

Y eso es todo, tienes una colección de objetos personalizados extraídos de XML. Si desea filtrar esos elementos por valor, o solo para aquellos que contienen un atributo específico, o si solo desea los primeros 5, o omitir el primer 1 y obtener los siguientes 3, o simplemente averiguar si se devolvió algún elemento ... BAM, todo está ahí en la misma línea de código.

Hay muchas clases de código abierto que facilitan mucho este procesamiento en Objective-C, por lo que hace gran parte del trabajo pesado. Simplemente no está tan integrado.

* NOTA: En realidad, no compilé el código anterior, solo es un ejemplo para ilustrar la relativa falta de verbosidad requerida por C #.

Brentlightsey
fuente
Es importante no mencionar, sin embargo, que no hay tanta "falta de verbosidad" por parte de C # en esta comparación, solo que la verbosidad está contenida en las clases de framework .net que está utilizando para analizar su XML. Si examina el código dentro de ellos, es probable que encuentre mucho más código C #, posiblemente incluso más detallado.
XIVSolutions
3

Probablemente la diferencia más importante es la gestión de la memoria. Con C # obtienes recolección de basura, en virtud de que es un lenguaje basado en CLR. Con Objective-C necesita administrar la memoria usted mismo.

Si viene de un entorno C # (o cualquier lenguaje moderno para el caso), pasar a un lenguaje sin administración automática de memoria será realmente doloroso, ya que dedicará gran parte de su tiempo de codificación a administrar correctamente la memoria (y depurar como bien).

DSO
fuente
6
ObjC tiene recolección de basura de seguimiento en estos días. Por otro lado, C # le permite administrar la memoria usted mismo si lo desea (gracias a los punteros sin procesar).
Pavel Minaev
3
No encuentro que la administración de memoria manual en Objective-C (en el contexto de los marcos de Apple) sea una gran carga: el ciclo de retención / liberación / liberación automática es mucho menos engorroso que la administración de memoria "tradicional" en C y C ++.
mipadi
5
Esto simplemente no es un DSO verdadero, incluso en un entorno que no es de recolección de basura como iPhone, las cosas de retención / liberación y liberación automática tardan unos 10 minutos en aprender y luego no es un problema. He encontrado muchos usuarios de C # a los que les gusta exagerar los desafíos de la gestión de la memoria. Es casi como si temieran que les empezaría a gustar demasiado obj-c de lo contrario ...;)
h4xxr
4
Los conceptos básicos de la administración de memoria manual no son difíciles. Pero puede complicarse muy rápido cuando comienza a pasar objetos asignados y necesita lidiar con gráficos de objetos complejos, porque debe seguir cuidadosamente las reglas sobre quién es responsable de liberar y cuándo. Las implementaciones de recuento de referencias lo hacen algo más fácil, excepto que necesita lidiar con ciclos en gráficos de objetos ... en comparación con C #, todo esto IMO es una gran diferencia.
DSO
1

Aquí hay un artículo bastante bueno que compara los dos idiomas: http://www.coderetard.com/2008/03/16/c-vs-objective-c/

Cinder6
fuente
Es una lástima que la página afirme estar en UTF-8, pero que tenga todo tipo de reemplazos desagradables para apóstrofes y comillas. Creo que su texto usa comillas "curvas", pero seguro que confunden el código ...
Quinn Taylor
parecen haber robado su introducción por completo, pero incluso el artículo fuente tiene su código machacado. tampoco es un artículo particularmente bueno.
dnord
-2

Aparte de la diferencia de paradigma entre los 2 idiomas, no hay mucha diferencia. Por mucho que odie decirlo, puede hacer el mismo tipo de cosas (probablemente no tan fácilmente) con .NET y C # como con Objective-C y Cocoa. A partir de Leopard, Objective-C 2.0 tiene recolección de basura, por lo que no tiene que administrar la memoria usted mismo a menos que lo desee (la compatibilidad de código con Mac más antiguas y aplicaciones de iPhone son 2 razones para querer).

En lo que respecta al código estructurado y legible, gran parte de la carga recae en el programador, como con cualquier otro lenguaje. Sin embargo, encuentro que el paradigma de paso de mensajes se presta bien a un código legible siempre que nombre sus funciones / métodos de manera apropiada (nuevamente, como cualquier otro lenguaje).

Seré el primero en admitir que no estoy muy familiarizado con C # o .NET. Pero las razones por las que Quinn enumeró anteriormente son varias razones por las que no me importa serlo.

alesplin
fuente
-3

Las llamadas al método utilizadas en obj-c hacen que el código sea de fácil lectura, en mi opinión, mucho más elegante que c # y obj-c está construido sobre c, por lo que todo el código de c debería funcionar bien en obj-c. Sin embargo, lo más vendido para mí es que obj-c es un estándar abierto, por lo que puede encontrar compiladores para cualquier sistema.

kubi
fuente
2
ISO C # también es un estándar abierto. Además, hasta donde yo sé, el único compilador de ObjC que existe es gcc.
Pavel Minaev
@Pavel: También está el compilador de objetos portátiles ( users.telenet.be/stes/compiler.html ) y clang.
mipadi
1
En realidad, GCC ya no es el único compilador: Clang y LLVM son un par de tecnologías diseñadas y desarrolladas para reemplazar a GCC y hacer cosas que nunca pudo hacer, incluida la compilación JIT. Este es el núcleo de OpenCL en Snow Leopard. También son extensibles a otros idiomas y vale la pena revisarlos.
Quinn Taylor
2
Honestamente, no consideraría que la portabilidad sea un profesional de Objective-C. Más bien, las fortalezas están más en la línea de un desarrollo rápido y un volumen reducido de código para lograr la misma tarea.
Quinn Taylor
Gracias por corregir mi error sobre la disponibilidad del compilador. Bueno, la portabilidad está técnicamente ahí de todos modos, puedo usar MinGW / ObjC en Win32 muy bien, por ejemplo, en ese sentido es tan portátil como el propio gcc. Por supuesto, las bibliotecas no estarán allí (aunque ... ¿hay GnuStep / Win32?), Pero esta situación no es mucho peor que la que tenemos con Mono; así que, en general, diría que la portabilidad no es un punto fuerte para ninguna de las partes.
Pavel Minaev