Respuestas:
Primero aprendería C. Aprendí C (e hice mucho en C) antes de pasar a Obj-C. Tengo muchos colegas que nunca fueron programadores reales de C, comenzaron con Obj-C y aprendieron solo tanto C como era necesario.
De vez en cuando veo cómo resuelven un problema por completo en Obj-C, lo que a veces resulta en soluciones muy torpes. Por lo general, luego reemplazo algún código Obj-C con código C puro (después de todo, puede mezclarlos tanto como desee, el contenido de un método Obj-C puede ser completamente código C puro). Sin ninguna intención de insultar a ningún programador de Obj-C, hay soluciones que son muy elegantes en Obj-C, estas son soluciones que simplemente funcionan (y lucen) mucho mejor gracias a los objetos(La programación OOP puede hacer que los programas complejos sean mucho más atractivos que la programación funcional; el polimorfismo, por ejemplo, es una característica brillante) ... y realmente me gusta Obj-C (¡mucho más que C ++! Odio la sintaxis de C ++ y algunas características del lenguaje son simplemente exageradas y conducir a malos patrones de desarrollo en mi humilde opinión); sin embargo, cuando a veces reescribo el código Obj-C de mis colegas (y realmente solo lo hago, si creo que esto es absolutamente necesario), el código resultante suele ser un 50% más pequeño, necesita solo el 25% de la memoria que usó antes y es aproximadamente un 400% más rápido en tiempo de ejecución.
Lo que intento decir aquí: cada idioma tiene sus pros y sus contras. C tiene pros y contras y Obj-C también. Sin embargo, la gran característica de Obj-C (es por eso que incluso me gusta más que Java) es que puedes saltar a C simple a voluntad y viceversa. ¿Por qué esta es una característica tan grandiosa? Porque al igual que Obj-C corrige muchos de los contras de C puro, C puro puede arreglar algunos de los contras de Obj-C. Si los mezcla, recibirá un equipo muy poderoso.
Si solo aprende Obj-C y no tiene idea de C o solo conoce sus conceptos básicos y nunca probó con qué elegancia puede resolver algunos problemas comunes, en realidad solo aprendió la mitad de Obj-C. C es una parte fundamental de Obj-C. La capacidad de utilizar C en cualquier momento y en cualquier lugar es una característica fundamental de la misma.
Un ejemplo típico fue un código que usamos que tenía que codificar datos en base64, pero no pudimos usar una biblioteca externa para eso (sin OpenSSL lib). Usamos un codificador base64, completamente escrito usando clases Cocoa. Funcionaba bien, pero cuando lo hicimos codificar 200 MB de datos binarios, tomó una eternidad y la sobrecarga de memoria fue inaceptable. Lo reemplacé con un codificador base64 diminuto y ultra compacto escrito completamente como una función C (copié el cuerpo de la función en el cuerpo del método, el método tomó NSData como entrada y devolvió NSString como salida, sin embargo, dentro de la función todo era C). El codificador C era mucho más compacto, vencía al codificador Cocoa puro por el factor 8 en velocidad y la sobrecarga de memoria también era mucho menor. Codificar / decodificar datos, jugar con bits y tareas similares de bajo nivel son solo los puntos fuertes de C.
Otro ejemplo fue un código de interfaz de usuario que dibujó muchos gráficos. Para almacenar los datos necesarios para pintar los gráficos, usamos NSArray's. En realidad, NSMutableArray's, ya que el gráfico fue animado. Resultado: animación gráfica muy lenta. Reemplazamos todos los NSArray con matrices C normales, objetos con estructuras (después de que toda la información de coordenadas del gráfico no es nada que deba tener en los objetos), el acceso al enumerador con bucles for simples y comenzamos a mover datos entre las matrices con memcopy en lugar de tomar datos de una matriz a el otro, índice por índice. El resultado: una aceleración del factor 4. El gráfico se animó sin problemas, incluso en sistemas PPC más antiguos.
La debilidad de C es que cada programa más complejo se vuelve feo a largo plazo. Mantener las aplicaciones C legibles, extensibles y manejables exige mucha disciplina por parte de un programador. Muchos proyectos fracasan porque falta esta disciplina. Obj-C le facilita la estructuración de su aplicación utilizando clases, herencia, protocolos, etc. Dicho esto, no usaría la funcionalidad C pura a través de las fronteras de un método a menos que sea necesario. Prefiero mantener todo el código en una aplicación Objective-C dentro del método de un objeto; todo lo demás frustra el propósito de una aplicación orientada a objetos. Sin embargo, dentro del método, a veces uso C puro exclusivamente.
Puede aprender fácilmente C y Objective-C al mismo tiempo; ciertamente no hay necesidad de aprender las minucias de C (incluida la aritmética de punteros, etc.) antes de comenzar con las adiciones de Objective-C al lenguaje, y como programador novato comenzar con Objective-C rápidamente puede ayudarlo a comenzar a "pensar en objetos" más rápidamente.
En términos de recursos disponibles, la documentación de Apple generalmente asume familiaridad con C, por lo que comenzar con el lenguaje de programación Objective-C 2.0 no será de gran beneficio para usted. Yo invertiría en una copia de Programming in Objective-C de Stephen Kochan (dependiendo de la rapidez con la que desee comenzar, puede considerar esperar la segunda edición):
Biblioteca de desarrolladores de Programming Objective-C Objective-C 2.0
No asume experiencia previa y le enseña Objective-C y tanto C como necesite.
Si se siente un poco ambicioso, puede comenzar con el tutorial "Learn C" de Scott Stevenson , pero tiene algunos requisitos previos ("Ya debería conocer al menos un lenguaje de programación o de scripting, incluidas funciones, variables y bucles. También necesitaré escribir comandos en la Terminal Mac OS X. ").
(Solo para que conste y para el contexto: aprendí ambos al mismo tiempo en 1991; no pareció hacerme ningún daño. Sin embargo, tenía experiencia en BASIC, Pascal, Logo y LISP. )
Pensé mucho en este tema antes de escribir mi libro sobre Objective-C. Primero, realmente creo que aprender el lenguaje C antes de aprender Objective-C es el camino equivocado. C es un procedimientolenguaje que contiene muchas características que no son necesarias para programar en Objective-C, especialmente en el nivel principiante. De hecho, recurrir a algunas de estas características va en contra de la adhesión a una buena metodología de programación orientada a objetos. Tampoco es una buena idea enseñar todos los detalles de un lenguaje procedimental (y atacar la solución de un problema con funciones y técnicas de programación estructurada) antes de aprender uno orientado a objetos. Esto puede hacer que el programador se ponga en la dirección equivocada, lo que puede llevar a desarrollar una orientación y una mentalidad equivocadas para fomentar una buena disciplina de programación orientada a objetos. ¡El hecho de que Objective-C sea una extensión del lenguaje C no significa que primero tengas que aprender C!
Creo que enseñar Objective-C y el lenguaje C subyacente como un solo lenguaje integrado es el enfoque correcto. No hay razón para saber que una declaración "for" proviene del lenguaje C y no de su superconjunto Objective-C. Además, ¿por qué aprender en detalle sobre cosas como matrices y cadenas de C (y manipularlas) antesaprender acerca de matrices (NSArray) y objetos de cadena (NSString), por ejemplo? Muchos textos en C dedican mucho tiempo a las estructuras y los punteros a las estructuras, y a iterar a través de matrices con punteros. Pero puede comenzar a escribir programas Objective-C sin conocer ninguna de estas características del lenguaje C. Y para un programador novato, eso es un gran problema. Eso no solo acorta la curva de aprendizaje, sino que también reduce la cantidad de material que debe aprenderse (y parte de él se filtra selectivamente) para escribir programas Objective-C.
Estoy de acuerdo en que querrá aprender la mayoría, si no todas, de las características subyacentes de C, pero muchas se pueden diferir hasta una comprensión sólida de la definición de clases y métodos, trabajar con objetos y expresiones de mensajes y comprender los conceptos de herencia y polimorfismo son bien conocidos.
Me sumergiría directamente en Objective C: si ya tiene algunos idiomas en su haber, no es la sintaxis la que es la curva de aprendizaje, es Cocoa.
Creo que, en su mayor parte, aprender C es una buena idea sin importar a qué campo te dirijas, al menos para dominar el funcionamiento interno del desarrollo de software antes de usar productos empaquetados, de esa manera si algo sale mal. tienes más posibilidades de comprender el funcionamiento interno. Hay mucha discusión sobre esto en SO, y es una pregunta bastante subjetiva, pero en general, inherentemente usará C dentro de su código Objective-C, así que supongo que realmente depende de usted. Soy un tipo de persona de base, pero a veces puede interponerse en el camino y conozco a varias personas inteligentes que se abrieron camino de arriba hacia abajo, creo que la parte importante es que llegues a comprender el funcionamiento interno como sea. diferencie sus capacidades de las que no lo hacen y aumente sus capacidades.
Es una buena idea aprender C antes de aprender Objective-C, que es un superconjunto estricto de C. Esto significa que Objective-C puede admitir todo el código C normal, por lo que el código común a los programas C seguramente aparecerá incluso en Objective- Código C.
Además de mirar las cosas puramente desde el punto de vista del lenguaje, encontrará que Mac OS X es un sistema operativo Unix completo. Todas las bibliotecas de nivel de sistema están escritas en C.
Probablemente sea posible aprender ambos al mismo tiempo, pero creo que apreciará y comprenderá más Objective-C si primero tiene un conocimiento práctico sólido de C.
Aprendería Objective-C y aprendería tanto C como necesite a medida que avanza.
Las áreas de C de las que no dependerá mucho:
A medida que aprende Objective-C y Cocoa, no puede evitar aprender bits de C. Por ejemplo, los rectángulos son comúnmente representados por CGRect, una estructura de C.
Si tiene tiempo, aprenda C. Como otros han dicho aquí, el libro de Kochan (segunda y primera ediciones) es excelente como un libro para sumergirse.
Hay muchas cosas que no puedes hacer únicamente en Objective-C, por lo que aprender algunas habilidades básicas de C será bastante crítico. Al menos necesitará comprender las declaraciones de variables y las funciones básicas de la biblioteca de C, o se sentirá frustrado.
Honestamente, muchos lenguajes se basan en la sintaxis de C, por lo que es bueno estar familiarizado. Me tomaría una semana o dos familiarizarme con C independientemente.
Dicho esto, me enseñé el Objetivo C por mí mismo, y tengo que ser honesto: no encontré mi experiencia C tan útil como hubiera pensado. El objetivo C definitivamente me abrió los ojos.
Puede saltar directamente a Objective-C, con los siguientes beneficios:
Al menos para mí es más fácil aprender un nuevo idioma cuando estoy interesado en alguna aplicación o muestra específica, y fallo cuando tengo que aprender otra cosa que no es exactamente lo que me interesa.
Siempre puede refinar su conocimiento de C más adelante si se interesa en la programación de nivel inferior.
Mejor, no lo sé, mucho menos porque no estoy familiarizado con Objective-C.
Pero las bases de C no son tan difíciles de aprender, no es un lenguaje muy complejo (en términos de sintaxis, no en términos de dominio), así que adelante, no será una pérdida de tiempo.
Personalmente, creo que siempre es una buena idea aprender C, da una buena idea de cómo funciona la computadora. Después de todo, la mayoría de lenguajes y sistemas todavía están escritos en C. ¡Entonces sigue adelante! :-)
PD: Con "seguir adelante", no quise decir "dejarlo", solo "aprender más, aprender diferente". Una vez que conozca C, es posible que nunca lo deje caer: Java usa JNI para llamar a rutinas C para cosas de bajo nivel, Python, Lua, etc.a menudo se extienden con código C (la referencia de Lua incluso solo asume algunos conocimientos de C para algunas funciones que son solo una envoltura delgada a la función C detrás), y así sucesivamente.
Sí, aprender el lenguaje C antes que cualquier otro idioma avanzado te ayudará a aprender rápidamente otros idiomas.
C le brinda muy poca abstracción del ensamblaje. Algunos compiladores de C incluso le permitirán ensamblar en línea. Esto puede ser muy útil para pensar en cómo funciona la computadora, lo cual es importante saber.
Dicho esto, si está realmente interesado en Object-C, no se quede atascado escribiendo algo en C solo porque es "bueno para usted". No necesita frustrarse mientras intenta aprender un nuevo conjunto de habilidades. Es importante que te diviertas con lo que estás haciendo.
¿Quieres ser un desarrollador incondicional? Entonces aprenda c primero.
Los libros que necesita para dominar completamente c son algunos de los mejores escritos en tecnología. Esto es lo que necesita:
El objetivo C es lo suficientemente diferente de C como para no merecer aprender C primero.
Desde una perspectiva de sintaxis / familia de idiomas, es casi mejor que uno estudie SmallTalk (en el que se basa el objetivo C)
Desde una perspectiva práctica, concentre sus esfuerzos en aprender un idioma a la vez.
Más adelante, si desea aprender otro lenguaje, C ++, Java y Python son 1) fáciles de aprender en conjunto 2) populares y por lo tanto comercializables 3) poderosos.
Debe tener un conocimiento básico de C antes de iniciar Objective_C, pero no es necesario dominar todos los detalles de C.
He publicado mis notas después de leer "Programación en Objective-C" en caso de que ayude a alguien más.
Dependiendo de muchos idiomas que ya conozca, puede ser una mejor idea comenzar a aprender Objective-C. La base en la mayoría de los lenguajes es básicamente la misma, lo que es diferente es la sintaxis. Aprender C primero no va a marcar una gran diferencia cuando se trata de aprender Objective-C.
Aprendí Objective-C de inmediato y funcionó bien durante aproximadamente un año, solo tuve algunas dificultades para leer el código C cuando descargué el proyecto para ver cómo funcionan, pero ahora realmente siento la necesidad de aprender C.Puedes intentar aprender ObjC sin C, pero tarde o temprano necesitarás C.
En mi humilde opinión, primero debería aprender al menos algo de C y especialmente sobre punteros. Eso es aún más importante si uno proviene de un idioma que no tiene punteros. Mucha gente pregunta sobre códigos como
NSString *string = [[NSString alloc] init];
string = @"something";
ya que no conocen la distinción entre un puntero y el objeto al que apunta.
Por supuesto, uno no tiene que aprender todo C antes de comenzar con Objective-C, pero algunas cosas fundamentales son absolutamente necesarias.
Diablos no, ¡ve directamente al objetivo C!
Pasé de ActionScript 3 a Objective C, ¡y ya tengo un pasante en una empresa!
Haz lo que quieras.
Si aprende algún otro idioma antes, siempre tendrá confusión al escribir la sintaxis correcta. No sé el propósito, pero Object C usa una sintaxis extraña (no común) para llamar a métodos de objeto. Lo nombra como envío de mensajes, sí, es cierto, en consecuencia, concepto puro orientado a objetos, sin embargo, la mayoría de los lenguajes orientados a objetos lo nombran como método de llamada y utilizan una sintaxis más tradicional de métodos de llamada. La recolección de basura también es algo muy extraño, el Objeto C se basa en el recuento de referencias de la vieja escuela. Por lo que tendrá dificultades para aceptarlo si cambia de otro idioma. Estoy escribiendo un libro Guía de migración rápida de Object C para programadores de C / C ++ con la esperanza de ayudar a las personas a detectar todas las diferencias más rápido.