Aprendería C primero. Aprendí C (e hice mucho en C) antes de pasar a Obj-C. Tengo muchos colegas que nunca fueron verdaderos programadores en C, comenzaron con Obj-C y aprendieron solo la cantidad de C necesaria.
De vez en cuando veo cómo resuelven un problema completamente en Obj-C, a veces dando como resultado soluciones muy torpes. Usualmente reemplazo algún código Obj-C con código C puro (después de todo puedes mezclarlos tanto como quieras, el contenido de un método Obj-C puede ser un código C completamente puro). Sin ninguna intención de insultar a ningún programador Obj-C, hay soluciones que son muy elegantes en Obj-C, estas son soluciones que simplemente funcionan (y se ven) mucho mejor gracias a objetos (la programación OOP puede hacer que los programas complejos sean mucho más encantadora que la programación funcional, 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 obvias y conducen a malos patrones de desarrollo en mi humilde opinión); sin embargo, cuando a veces vuelvo a escribir el código Obj-C de mis colegas (y realmente solo lo hago, si creo que esto es absolutamente necesario), el código resultante es usualmente un 50% más pequeño, necesita solo el 25% de la memoria utilizada antes y es aproximadamente 400% más rápido en tiempo de ejecución.
Lo que estoy tratando de decir aquí: cada idioma tiene sus pros y sus contras. C tiene pros y contras y también lo tiene Obj-C. Sin embargo, la característica realmente buena de Obj-C (es por eso que me gusta más que Java) es que puedes saltar a la C a voluntad y viceversa. ¿Por qué esta es una gran característica? Debido a que al igual que Obj-C corrige muchos de los contras de C puro, C puro puede corregir algunos de los inconvenientes de Obj-C. Si los mezclas, recibirás un equipo muy poderoso.
Si solo aprendes Obj-C y no tienes idea de C o solo conoces los conceptos básicos y nunca has probado con qué elegancia puede resolver algunos problemas comunes, en realidad solo aprendiste la mitad de Obj-C. C es una parte fundamental de Obj-C. La capacidad de usar C en cualquier momento y en todas partes es una característica fundamental de la misma.
Un ejemplo típico fue algún código que usamos para codificar datos en base64, pero no pudimos usar una biblioteca externa para eso (no OpenSSL lib). Usamos un codificador base64, escrito completamente usando clases de Cocoa. Funcionaba bien, pero cuando codificamos 200 MB de datos binarios, tomó una eternidad y la sobrecarga de la memoria era inaceptable. Lo reemplacé con un pequeño codificador base64 ultracompacto escrito enteramente 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, pero dentro de la función todo era C). El codificador C era mucho más compacto, batía el codificador de Cacao puro por el factor 8 en velocidad y la sobrecarga de memoria también era mucho menor. Los datos de codificación/decodificación, jugando con bits y tareas de bajo nivel similares son solo los puntos fuertes de C.
Otro ejemplo fue algún código de UI que dibujó una gran cantidad de gráficos. Para almacenar los datos necesarios para pintar los gráficos, usamos NSArray. En realidad NSMutableArray, 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 debe tener en objetos), acceso del enumerador con bucles simples y comenzó a mover datos entre las matrices con memcopy en lugar de tomar datos de una matriz el otro, índice para índice. El resultado: una aceleración por el factor 4.El gráfico animó sin problemas, incluso en sistemas PPC antiguos.
La debilidad de C es que cada programa más complejo se pone feo a la larga. Mantener las aplicaciones C legibles, extensibles y manejables exige mucha disciplina de un programador. Muchos proyectos fracasan porque falta esta disciplina. Obj-C le facilita estructurar su aplicación usando clases, herencia, protocolos, etc. Dicho esto, no utilizaría la funcionalidad C pura a través de los bordes de un método a menos que sea necesario. Prefiero guardar todo el código en una aplicación Objective-C dentro del método de un objeto; todo lo demás derrota el propósito de una aplicación OO. Sin embargo, dentro del método a veces uso exclusivamente C puro.
y si ya conozco C++ y quiero aprender Objective-C para iPhone/iTouch deveopment, ¿es necesario aprender C? – chester89
@ chester89: si ya conoce C++, sabe lo suficiente sobre C para comenzar con Objective-C. – Sven
Sven tiene razón, C++ es tan complejo y ya usa mucha C pura, si conoces C++ realmente bien, también deberías conocer C lo suficientemente bien. – Mecki