Respostas:
Eu aprenderia C primeiro. Aprendi C (e muito em C) antes de passar para o Obj-C. Tenho muitos colegas que nunca foram programadores C reais, eles começaram com Obj-C e aprenderam apenas o C o necessário.
De vez em quando, vejo como eles resolvem um problema inteiramente no Obj-C, às vezes resultando em soluções muito desajeitadas. Normalmente, substituo algum código Obj-C por código C puro (afinal, você pode misturá-los o quanto quiser, o conteúdo de um método Obj-C pode ser inteiramente código C puro). Sem qualquer intenção de insultar qualquer programador Obj-C, existem soluções que são muito elegantes no Obj-C, são soluções que funcionam (e parecem) muito melhor graças a objetos(A programação OOP pode tornar programas complexos muito mais atraentes do que a programação funcional; polimorfismo, por exemplo, é um recurso brilhante) ... e eu realmente gosto de Obj-C (muito mais do que C ++! Eu odeio a sintaxe C ++ e alguns recursos de linguagem são simplesmente exageros e levar a padrões de desenvolvimento ruins (IMHO); no entanto, quando às vezes reescrevo o código Obj-C de meus colegas (e realmente só faço isso, se achar que é absolutamente necessário), o código resultante é geralmente 50% menor, precisa de apenas 25% da memória que usou antes e é cerca de 400% mais rápido em tempo de execução.
O que estou tentando dizer aqui: cada idioma tem seus prós e contras. C tem prós e contras, assim como Obj-C. No entanto, o recurso realmente excelente do Obj-C (é por isso que até gosto mais dele do que do Java) é que você pode pular para C simples à vontade e voltar novamente. Por que esse é um recurso tão bom? Porque assim como Obj-C corrige muitos dos contras do C puro, o C puro pode consertar alguns dos contras do Obj-C. Se você misturá-los, você receberá uma equipe muito poderosa.
Se você apenas aprende Obj-C e não tem idéia de C ou apenas conhece o básico dele e nunca experimentou como ele pode resolver alguns problemas comuns com elegância, na verdade aprendeu apenas metade de Obj-C. C é uma parte fundamental do Obj-C. A capacidade de usar C a qualquer hora e em qualquer lugar é uma característica fundamental dele.
Um exemplo típico foi algum código que usamos para codificar dados em base64, mas não podíamos usar uma biblioteca externa para isso (sem OpenSSL lib). Usamos um codificador base64, inteiramente escrito com classes Cocoa. Estava funcionando bem, mas quando o fizemos codificar 200 MB de dados binários, demorou uma eternidade e a sobrecarga de memória era inaceitável. Substituí-o por um codificador base64 minúsculo e ultracompacto escrito inteiramente como uma função C (copiei o corpo da função para o corpo do método, o método pegou NSData como entrada e retornou NSString como saída, porém dentro da função tudo era C). O codificador C era muito mais compacto, batia o codificador Cocoa puro pelo fator 8 em velocidade e a sobrecarga de memória também era muito menor. Codificar / decodificar dados, brincar com bits e tarefas de baixo nível semelhantes são apenas os pontos fortes de C.
Outro exemplo foi algum código de IU que desenhou muitos gráficos. Para armazenar os dados necessários para pintar os gráficos, usamos NSArray's. Na verdade NSMutableArray's, já que o gráfico foi animado. Resultado: animação gráfica muito lenta. Substituímos todos os NSArray por arrays C normais, objetos por structs (afinal as informações de coordenadas do gráfico não são nada que você deve ter em objetos), acesso de enumerador com loops for simples e começamos a mover dados entre os arrays com memcopy em vez de pegar dados de um array para o outro, índice por índice. O resultado: uma aceleração pelo fator 4. O gráfico foi animado suavemente, mesmo em sistemas PPC mais antigos.
O ponto fraco do C é que todo programa mais complexo fica feio no longo prazo. Manter os aplicativos C legíveis, extensíveis e gerenciáveis exige muita disciplina de um programador. Muitos projetos falham porque essa disciplina está faltando. Obj-C torna mais fácil para você estruturar sua aplicação usando classes, herança, protocolos e assim por diante. Dito isso, eu não usaria a funcionalidade C pura além das fronteiras de um método, a menos que seja necessário. Eu prefiro manter todo o código em um aplicativo Objective-C dentro do método de um objeto; todo o resto vai contra o propósito de um aplicativo OO. No entanto, dentro do método, às vezes uso C puro exclusivamente.
Você pode aprender facilmente C e Objective-C ao mesmo tempo - certamente não há necessidade de aprender as minúcias de C (incluindo aritmética de ponteiros e assim por diante) antes de começar com as adições de Objective-C à linguagem, e como um programador novato iniciar o Objective-C rapidamente pode ajudá-lo a começar a "pensar em objetos" mais rapidamente.
Em termos de recursos disponíveis, a documentação da Apple normalmente pressupõe familiaridade com C, portanto, começar com The Objective-C 2.0 Programming Language não será muito benéfico para você. Eu investiria em uma cópia de Programming in Objective-C, de Stephen Kochan (dependendo da rapidez com que você deseja começar, considere esperar pela segunda edição):
Biblioteca de desenvolvedores de programação Objective-C Biblioteca de desenvolvedores de programação Objective-C 2.0
Ele não assume nenhuma experiência anterior e ensina Objective-C e tanto C quanto você precisa.
Se você se sentir um pouco ambicioso, pode começar com o tutorial "Aprenda C" de Scott Stevenson , mas ele tem alguns pré-requisitos ("Você já deve saber pelo menos uma linguagem de script ou programação, incluindo funções, variáveis e loops. Você ' Também será necessário digitar comandos no Terminal Mac OS X. ").
(Apenas para registro e contexto: eu aprendi os dois ao mesmo tempo em 1991 - não pareceu me fazer mal. Eu, no entanto, tinha experiência em BASIC, Pascal, Logo e LISP. )
Pensei muito sobre esse assunto antes de escrever meu livro sobre Objective-C. Primeiro, eu realmente acredito que aprender a linguagem C antes de aprender Objective-C é o caminho errado. C é um processuallinguagem contendo muitos recursos que não são necessários para a programação em Objective-C, especialmente no nível iniciante. Na verdade, recorrer a alguns desses recursos vai contra a tendência de aderir a uma boa metodologia de programação orientada a objetos. Também não é uma boa ideia ensinar todos os detalhes de uma linguagem procedural (e atacar a solução de um problema com funções e técnicas de programação estruturada) antes de aprender uma linguagem orientada a objetos. Isso pode colocar o programador na direção errada, potencialmente levando ao desenvolvimento da orientação e mentalidade erradas para promover uma boa disciplina de programação orientada a objetos. Só porque Objective-C é uma extensão da linguagem C, não significa que você precisa aprender C primeiro!
Acho que ensinar Objective-C e a linguagem C subjacente como uma única linguagem integrada é a abordagem certa. Não há razão para aprender que uma instrução "for" vem da linguagem C e não de seu superconjunto da linguagem Objective-C. Além disso, por que aprender em detalhes sobre coisas como arrays C e strings (e como manipulá-los) antesaprendendo sobre array (NSArray) e objetos string (NSString), por exemplo? Muitos textos C dedicam muito tempo a estruturas e ponteiros a estruturas e iteração por meio de arrays com ponteiros. Mas você pode começar a escrever programas Objective-C sem conhecer nenhum desses recursos da linguagem C. E para um programador novato, isso é um grande negócio. Isso não apenas encurta a curva de aprendizado, mas também reduz a quantidade de material que deve ser aprendido (e parte dele seletivamente filtrado) para escrever programas Objective-C.
Eu concordo que você desejará aprender a maioria, senão todos, os recursos subjacentes do C, mas muitos podem ser adiados até uma compreensão sólida de como definir classes e métodos, trabalhar com objetos e expressões de mensagem e compreender os conceitos de herança e polimorfismo são bem compreendidos.
Eu mergulharia direto no Objective C - se você já tem alguns idiomas em seu currículo, não é a sintaxe que é a curva de aprendizado, é o cacau.
Acho que, na maioria das vezes, aprender C é uma boa ideia, não importa em que área você esteja, pelo menos para pegar o jeito do funcionamento interno do desenvolvimento de software antes de usar produtos pré-embalados, dessa forma, se algo der errado você tem uma chance melhor de compreender o funcionamento interno. Há muita discussão sobre isso no SO, e é uma questão bastante subjetiva, mas em geral você usará inerentemente C em seu código Objective-C, então acho que depende de você. Eu sou o tipo de pessoa do chão, mas às vezes isso pode atrapalhar e eu conheço várias pessoas inteligentes que trabalharam de cima para baixo. Acho que a parte importante é que você compreenda o funcionamento interno da maneira que for diferencie seus recursos daqueles que não o fazem e também aumente seus recursos.
É uma boa ideia aprender C antes de aprender Objective-C, que é um superconjunto estrito de C. Isso significa que Objective-C pode suportar todo o código C normal, portanto, o código comum aos programas C é obrigado a aparecer mesmo em Objective- Código C.
Além de ver as coisas puramente do ponto de vista da linguagem, você descobrirá que o Mac OS X é um sistema operacional Unix completo. Todas as bibliotecas de nível de sistema são escritas em C.
Provavelmente é possível aprender os dois ao mesmo tempo, mas acho que você apreciará e compreenderá mais Objective-C se primeiro tiver um conhecimento prático de C sólido.
Eu aprenderia Objective-C e aprenderia tanto C quanto você precisar à medida que avança.
As áreas de C das quais você não dependerá muito:
Conforme você aprende Objective-C e Cocoa, não pode evitar o aprendizado de bits de C. Por exemplo, retângulos são comumente representados por CGRect, uma estrutura C.
Se você tiver tempo, aprenda C. Como outros já disseram aqui, o livro de Kochan (segunda e primeira edições) é excelente como um livro para mergulhar.
Há muitas coisas que você não pode fazer puramente em Objective-C, então aprender algumas habilidades básicas de C será muito crítico. Você precisará pelo menos entender as declarações de variáveis e as funções básicas da biblioteca C, ou ficará frustrado.
Honestamente, muitas linguagens são baseadas na sintaxe C que é bom estar familiarizado. Eu levaria uma ou duas semanas para me familiarizar com C de qualquer maneira.
Dito isso, acabei de me ensinar o Objetivo C, e tenho que ser honesto: não achei minha experiência com C tão útil quanto pensava. Objetivo C foi definitivamente revelador para mim.
Você pode pular diretamente para Objective-C, com os seguintes benefícios:
Pelo menos para mim é mais fácil aprender um novo idioma quando estou interessado em algum aplicativo ou amostra específica, e fracasso quando tenho que aprender outra coisa que não é exatamente o que estou interessado.
Você sempre pode refinar seu conhecimento de C mais tarde, se ficar interessado em programação de nível inferior.
Melhor, não sei, muito menos porque não conheço Objective-C.
Mas as bases do C não são tão difíceis de aprender, não é uma linguagem muito complexa (em termos de sintaxe, não em termos de masterização!), Então vá em frente, não será uma perda de tempo.
Pessoalmente, acho sempre uma boa ideia aprender C, pois dá uma boa ideia de como o computador funciona. Afinal, a maioria das linguagens e sistemas ainda são escritos em C. Então siga em frente! :-)
PS .: Por "seguir em frente", não quis dizer "largue", apenas "aprenda mais, aprenda diferente". Depois de conhecer C, você nunca mais vai abandoná-lo: Java usa JNI para chamar rotinas C para coisas de baixo nível, Python, Lua, etc. são frequentemente estendidos com código C (a referência de Lua apenas assume algum conhecimento de C para algumas funções que são apenas um invólucro fino para a função C por trás) e assim por diante.
Sim, aprender a linguagem C antes de qualquer outro idioma avançado o ajudará a aprender outros idiomas rápidos.
C oferece muito pouca abstração do assembly. Alguns compiladores C até permitem a montagem embutida. Isso pode ser muito útil para pensar sobre como o computador funciona, o que é importante saber.
Dito isso, se você está realmente interessado em Object-C, não se deixe levar por escrever algo em C só porque é "bom para você". Você não precisa se frustrar enquanto tenta aprender um novo conjunto de habilidades. É importante que você se divirta com o que está fazendo.
Você quer ser um desenvolvedor de núcleo duro? Em seguida, aprenda c primeiro.
Os livros que você precisa para dominar completamente c são alguns dos melhores escritos em tecnologia. Aqui está o que você precisa:
O objetivo C é suficientemente diferente de C para não merecer aprender C primeiro.
De uma perspectiva de sintaxe / família de linguagem, é quase melhor estudar SmallTalk (no qual o objetivo C é baseado)
De uma perspectiva prática, concentre seus esforços em aprender um idioma de cada vez.
Posteriormente, se você deseja aprender outra linguagem, C ++, Java e Python são 1) fáceis de aprender em conjunto 2) populares e, portanto, comercializáveis 3) poderosos.
Você deve ter um conhecimento básico de C antes de iniciar Objective_C, mas não há necessidade de dominar todos os detalhes de C.
Publiquei minhas notas depois de ler "Programação em Objective-C", caso isso ajude outra pessoa.
Dependendo de muitas linguagens que você já conhece, pode ser uma ideia melhor começar a aprender Objective-C. A base na maioria das linguagens é basicamente a mesma, é a sintaxe que é diferente. Aprender C primeiro não vai fazer muita diferença quando se trata de aprender Objective-C.
Aprendi Objective-C imediatamente e funcionou bem por cerca de um ano. Só tive alguma dificuldade em ler o código C quando baixei o projeto para ver como eles funcionam, mas agora eu realmente sinto a necessidade de aprender C. Você pode tentar aprender ObjC sem C, mas mais cedo ou mais tarde, você precisará de C.
IMHO deve-se primeiro aprender pelo menos alguns C e especialmente sobre ponteiros. Isso é ainda mais importante se alguém vier de uma linguagem que não possui ponteiros. Muitas pessoas perguntam sobre códigos como
NSString *string = [[NSString alloc] init];
string = @"something";
uma vez que eles não sabem sobre a distinção entre um ponteiro e o objeto para o qual ele aponta.
É claro que não é preciso aprender tudo em C antes de começar com Objective-C, mas algumas coisas fundamentais são absolutamente necessárias.
Caramba, não, vá direto para o objetivo C!
Mudei do ActionScript 3 para o Objective C e já tenho um estagiário em uma empresa!
Faça o que você quiser.
Se você aprender algum outro idioma antes, sempre terá confusão ao escrever a sintaxe correta. Não sei o propósito, mas Object C usa sintaxe estranha (não comum) para chamar métodos de objeto. Ele o nomeia como envio de mensagens, sim, é verdade, de acordo com o puro conceito orientado a objeto, no entanto, a maioria das linguagens orientadas a objeto o nomeia como método de chamada e usa uma sintaxe mais tradicional de métodos de chamada. A coleta de lixo também é algo muito estranho, o Objeto C é baseado na contagem de referência da velha escola. Portanto, você terá dificuldade em aceitá-lo se mudar de outro idioma. Estou escrevendo um livro guia de migração rápida de Object C para programadores C / C ++ na esperança de ajudar as pessoas a perceber todas as diferenças mais rapidamente.