Como Objective-C se compara a C #? [fechadas]

87

Recentemente, comprei um Mac e o uso principalmente para desenvolvimento em C # no VMWare Fusion. Com todos os aplicativos Mac legais ao redor, comecei a pensar no Xcode à espreita com apenas um clique de instalação e aprender Objective-C.

A sintaxe entre as duas linguagens parece muito diferente, provavelmente porque Objective-C tem suas origens em C e C # tem suas origens em Java / C ++. Mas diferentes sintaxes podem ser aprendidas, então deve estar tudo bem.

Minha principal preocupação é trabalhar com a linguagem e se ela ajudará a produzir um código bem estruturado, legível e elegante. Eu realmente gosto de recursos como LINQ e var em C # e me pergunto se há recursos equivalentes ou melhores / diferentes em Objective-C.

Quais recursos de linguagem vou sentir falta de desenvolver com Objective-C? Quais recursos irei ganhar?

Edit: As comparações de framework são úteis e interessantes, mas uma comparação de linguagem é o que esta pergunta realmente está perguntando (em parte, minha culpa por originalmente marcar com .net). Presumivelmente, o Cocoa e o .NET são estruturas muito ricas por si só e ambos têm sua finalidade, um voltado para o Mac OS X e o outro para Windows.

Obrigado pelos pontos de vista bem pensados ​​e razoavelmente equilibrados até agora!

Alex Angas
fonte
27
O Xcode não é perfeito, mas certamente tem muitos recursos poderosos e úteis. Desprezar algo como "puro mal" sem apoiá-lo ou fornecer qualquer contexto para comparação é FUD que não ajuda ninguém. Em qualquer caso, é irrelevante para a pergunta.
Quinn Taylor,
11
O Xcode 3.2 é possivelmente o melhor IDE que já usei, com sua elegante manipulação de pontos de interrupção, análise estática, mensagens de erro em linha e toneladas de outros recursos. A propósito, é "Xcode" e não "XCode". @Nathan, realmente não vejo por que você precisa denegrir o Xcode chamando-o de "mal puro" - sem qualquer justificativa - em uma discussão sobre linguagens.
PlagueHammer
6
Uma grande coisa que você ganhará usando Objective-C é que você terá acesso aos frameworks Cocoa. Além disso, C, C #, Java e C ++ compartilham uma herança sintática comum. Objective-C obtém sua sintaxe de Smalltalk.
Amok,
4
Você trabalha C # usando fusão VMWare? Basta usar mono e monodevelop (que é uma versão de código aberto do .NET e Visual Studio que funciona no Mac e Linux. Usando o Mono, você também pode criar aplicativos para Mac e iPhone usando C # enquanto também usa a biblioteca .NET, bem como Cocoa ...
Robin Heggelund Hansen
5
@ user668039 15 anos de experiência usando C #? Foi lançado em 2001!
Ian Newson

Respostas:

89

Nenhuma linguagem é perfeita para todas as tarefas e Objective-C não é exceção, mas existem algumas sutilezas muito específicas. Como usar LINQe var(para o qual não estou ciente de uma substituição direta), alguns deles são estritamente relacionados à linguagem e outros são relacionados à estrutura.

( NOTA: Assim como C # é fortemente acoplado com .NET, Objective-C é fortemente acoplado com Cocoa. Portanto, alguns dos meus pontos podem parecer não relacionados a Objective-C, mas Objective-C sem Cocoa é semelhante a C # sem .NET / WPF / LINQ, rodando em Mono, etc. Não é assim que as coisas são normalmente feitas.)

Não pretendo elaborar completamente as diferenças, prós e contras, mas aqui estão alguns que vêm à mente.

  • Uma das melhores partes do Objective-C é a natureza dinâmica - em vez de chamar métodos, você envia mensagens, que o tempo de execução roteia dinamicamente. Combinado (criteriosamente) com a tipagem dinâmica, isso pode tornar muitos padrões poderosos mais simples ou mesmo triviais de implementar.

  • Como um superconjunto estrito de C, Objective-C confia que você sabe o que está fazendo. Ao contrário da abordagem gerenciada e / ou segura de tipos de linguagens como C # e Java, Objective-C permite que você faça o que quiser e experimente as consequências. Obviamente, isso pode ser perigoso às vezes, mas o fato de que a linguagem não o impede ativamente de fazer a maioria das coisas é bastante poderoso. ( EDITAR: devo esclarecer que C # também tem recursos e funcionalidades "inseguros", mas seu comportamento padrão é código gerenciado, que você deve cancelar explicitamente. Em comparação, apenas Java permite código typesafe e nunca expõe ponteiros brutos em da maneira que C e outros fazem.)

  • Categorias (adicionar / modificar métodos em uma classe sem subclassificar ou ter acesso ao código-fonte) é uma faca de dois gumes incrível. Ele pode simplificar muito as hierarquias de herança e eliminar o código, mas se você fizer algo estranho, os resultados podem ser confusos.

  • O Cocoa torna a criação de aplicativos GUI muito mais simples de várias maneiras, mas você precisa entender o paradigma. O design MVC é difundido no Cocoa, e padrões como delegados, notificações e aplicativos GUI multi-threaded são adequados para Objective-C.

  • As vinculações Cocoa e a observação de valores-chave podem eliminar toneladas de código de cola, e as estruturas Cocoa aproveitam isso amplamente. O despacho dinâmico de Objective-C trabalha lado a lado com isso, então o tipo do objeto não importa, contanto que seja compatível com o valor-chave.

  • Você provavelmente sentirá falta de genéricos e namespaces, e eles têm seus benefícios, mas na mentalidade e paradigma do Objective-C, eles seriam sutilezas em vez de necessidades. (Genéricos têm tudo a ver com segurança de tipos e evitando a conversão, mas a tipagem dinâmica em Objective-C torna isso essencialmente um problema. Os namespaces seriam bons se bem feitos, mas são simples o suficiente para evitar conflitos de que o custo indiscutivelmente supera os benefícios, especialmente para código legado.)

  • Para simultaneidade, Blocks (um novo recurso de linguagem no Snow Leopard e implementado em dezenas de APIs Cocoa) são extremamente úteis. Algumas linhas (frequentemente associadas ao Grand Central Dispatch, que faz parte do libsystem em 10.6) podem eliminar clichês significantes de funções de retorno de chamada, contexto, etc. (Blocos também podem ser usados ​​em C e C ++ e certamente podem ser adicionados a C #, o que seria incrível.) NSOperationQueue também é uma maneira muito conveniente de adicionar simultaneidade ao seu próprio código, despachando subclasses NSOperation personalizadas ou blocos anônimos que o GCD executa automaticamente em um ou mais threads diferentes para você.

Quinn Taylor
fonte
7
Tecnicamente, C # tem todos os recursos de energia não seguros de tipo que ObjC possui: ponteiros brutos, aritmética de ponteiros, matrizes não verificadas limitadas, uniões alloca,. Isso simplesmente não os torna tão acessíveis - você precisa ativá-los explicitamente.
Pavel Minaev,
8
Eu simplesmente menciono Cocoa porque a maior parte do apelo da programação em Objective-C é devido aos frameworks Cocoa. C # seria interessante sem .NET e / ou WPF? O autor da pergunta mencionou especificamente o LINQ, então ele obviamente está olhando além da linguagem, para a experiência.
Quinn Taylor,
7
O que é ótimo. Não estou tentando arranjar briga com C #. Se eu tivesse que escrever um software para Windows, é o que usaria. Estou apenas tentando apontar semelhanças e diferenças entre as linguagens e ferramentas relacionadas. Você obviamente tem mais experiência com C # e eu com Objective-C. Agradeço seus esclarecimentos, mas talvez respostas mais construtivas e menos complicadas sejam mais úteis.
Quinn Taylor,
11
Não é complicado, Quinn. Eu meramente apontei que o que começou como uma comparação de linguagem se transformou em uma discussão geral de como o Cacau é bom em algum ponto de sua resposta. Eu ainda gostaria de apontar que seus pontos sobre o Cocoa não são comparações - eles dizem "faz X bem" - e pode muito bem ser o caso - mas eles não dizem "faz X melhor / pior do que C # + WPF ", que é sobre o que trata a questão de forma ampla.
Pavel Minaev,
6
+1 resposta excelente Quinn
h4xxr
54

Tenho programado em C, C ++ e C # há mais de 20 anos, comecei em 1990. Acabo de decidir dar uma olhada no desenvolvimento do iPhone e no Xcode e Objective-C. Ai meu Deus ... retiro todas as reclamações sobre a Microsoft, agora percebo como o código está ruim. Objective-C é muito complexo em comparação com o que C # faz. Fiquei estragado com C # e agora agradeço todo o trabalho árduo que a Microsoft colocou. Apenas ler Objective-C com invocações de método é difícil de ler. C # é elegante nisso. Essa é apenas minha opinião, eu esperava que a linguagem de desenvolvimento da Apple fosse tão boa quanto os produtos da Apple, mas querida, eles têm muito a aprender com a Microsoft. Não há dúvida de que o aplicativo C # .NET posso colocar um aplicativo em funcionamento muitas vezes mais rápido do que o XCode Objective-C. A Apple certamente deveria dar uma olhada no livro da Microsoft aqui e então teríamos o ambiente perfeito. :-)

Waz
fonte
47
Mesmo que você tenha consultado um livro de desenvolvimento do iPhone, ainda consegue criar um aplicativo mais rápido em uma plataforma na qual tem 20 anos de experiência? INCRÍVEL
kubi
25
Estou tendo exatamente a mesma experiência que o Waz. Também sou muito mais grato pelo trabalho que a Microsoft colocou em C # e nas ferramentas de desenvolvimento como o Visual Studio, depois que comecei a aprender o Objetivo C.
René
4
Essa também foi minha experiência ao estudar objetivo-c, supercomplexidade em comparação com c #. @ alexy13 Que parte do c e c ++ da mensagem original você perdeu? Ter décadas de experiência em uma família de idiomas ajuda MUITO a avaliar o quão difícil é fazer o mesmo trabalho com outro idioma da mesma família.
Anderson Fortaleza
5
como é essa resposta principal? não é uma resposta concisa, apenas uma opinião claramente tendenciosa de algum idioma que ele aprendeu durante a noite vs um idioma que ele vem usando há mais de 20 anos ... obviamente você não será tão proficiente no novo idioma
Heavy_Bullets
3
"Just reading Objective-C with method invokes is difficult to read"- aqui está apenas um argumento muito subjetivo que é mencionado aqui como contras do Obj-C. Todos os outros são apenas retórica discutível.
skywinder
46

Nenhuma revisão técnica aqui, mas eu apenas acho Objective-C muito menos legível. Dado o exemplo que o Cinder6 deu a você:

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)

Objective-C

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

Parece horrível. Eu até tentei ler 2 livros sobre ele, eles me perderam no início, e normalmente eu não entendo isso com livros / linguagens de programação.

Estou feliz por termos o Mono para Mac OS, porque se eu tivesse que confiar na Apple para me dar um bom ambiente de desenvolvimento ...

TimothyP
fonte
17
Ignorando o fato de que a 1ª linha deve terminar com [NSMutableArray array](ele está perdendo memória) e a 4ª linha deve começar com NSString* xou id x(erro de compilação) ... Sim, Objective-C não tem genéricos (honestamente não sinto falta deles), você não Não indexe objetos com sintaxe de array e as APIs geralmente são mais detalhadas. To-may-to, to-mah-to. Na verdade, tudo se resume ao que você prefere ver. (Você poderia escrever o mesmo código em C ++ STL e eu acharia horrível.) Para mim, código legível geralmente significa que o texto do código informa o que está fazendo e, portanto, o código Objective-C é preferível.
Quinn Taylor,
18
Eu realmente não acho nada de errado com a sintaxe como tal - a principal razão pela qual ela parece menos legível é porque 1) ela não é familiar para todos vindos do background do C, e 2) é usada no meio de construções C simples, onde parece estranho. Por outro lado, os parâmetros nomeados de Smalltalkish como parte do nome do método tornam as chamadas mais compreensíveis desde o início. Na verdade, seu exemplo de código C # demonstra isso bem - ele não compilará, porque List<T>.Removeleva uma string como um argumento e remove a primeira ocorrência dessa string. Para remover por índice, você precisa RemoveAt.
Pavel Minaev,
12
... enquanto a versão ObjC com removeObjectAtIndex:, embora mais detalhada, também não é ambígua quanto ao que faz.
Pavel Minaev,
6
Excelentes pontos, Pavel. Além disso, a inconsistência entre strings[0]e strings.RemoveAt(0)diminui a clareza, pelo menos para mim. (Além disso, sempre me incomoda quando os nomes dos métodos começam com uma letra maiúscula ... Eu sei que é uma pequena coisinha, mas é simplesmente estranho.)
Quinn Taylor
4
No meu caso, como para muitas pessoas, a legibilidade da "ferramenta" afeta minha produtividade. Estou confortável e produtivo com muitas linguagens Objective-C, entretanto, nunca foi uma delas e não é por falta de tentativa. Mas, novamente, no final do dia, tudo se resume à preferência pessoal. Ao contrário de 20 anos atrás, você não é forçado a usar a linguagem X para direcionar a plataforma Y. Você escolhe o que melhor se adapta a você.
TimothyP
17

O gerenciamento manual de memória é algo com o qual iniciantes em Objective-C parecem ter mais problemas, principalmente porque pensam que é mais complexo do que é.

Objective-C e Cocoa, por extensão, dependem de convenções sobre a aplicação; conheça e siga um conjunto muito pequeno de regras e você receberá muito de graça pelo tempo de execução dinâmico em troca.

A regra não 100% verdadeira, mas boa o suficiente para o dia a dia, é:

  • Cada chamada para allocdeve corresponder a um releaseno final do escopo atual.
  • Se o valor de retorno do seu método foi obtido até allocentão, ele deve ser retornado por em return [value autorelease];vez de ser correspondido por um release.
  • Use propriedades e não há regra três.

A explicação mais longa segue.

O gerenciamento de memória é baseado na propriedade; apenas o proprietário de uma instância de objeto deve liberar o objeto, todos os outros devem sempre não fazer nada. Isso significa que em 95% de todo o código, você trata Objective-C como se fosse uma coleta de lixo.

E quanto aos outros 5%? Você tem três métodos para procurar; qualquer instância de objeto recebida desses métodos é de propriedade do escopo do método atual :

  • alloc
  • Qualquer método que comece com a palavra novo , como newounewService .
  • Qualquer método que contenha a palavra cópia, como copye mutableCopy.

O método tem três opções possíveis do que fazer com as instâncias de objeto de sua propriedade antes de sair:

  • Solte-o usando release se não for mais necessário.
  • Atribuir propriedade ao campo a (variável de instância) ou a uma variável global simplesmente atribuindo-a.
  • Abra mão da propriedade, mas dê a outra pessoa a chance de assumir a propriedade antes que a instância desapareça chamando autorelease.

Então, quando você deve tomar posse proativamente, ligando retain? Dois casos:

  • Ao atribuir campos em seus inicializadores.
  • Ao implementar manualmente o método setter.
PeyloW
fonte
2
1 Excelente resumo. Parece muito semelhante a quando aprendi C anos atrás.
Alex Angas,
4
Só para esclarecer, a coleta de lixo é totalmente compatível com Objective-C no Mac e não é necessário fazer nenhum gerenciamento manual de memória. O gerenciamento manual de memória só é necessário no iOS.
PlagueHammer de
3
Ainda assim, é bom aprender o básico sobre gerenciamento de memória, mesmo que seja apenas para melhorar o desempenho quando você precisar (não precisa executar a coleta de lixo).
FeifanZ
3
O iOS 5 introduziu o ARC, eliminando a necessidade de liberar manualmente o objeto alocado. Mas ainda não é tão fácil quanto C #. Você tem que ter em mente que Objective-C tem mais de 20 anos, e manteve alguns dos requisitos das linguagens daqueles dias: isto é, saber quando alocar e quando liberar / liberar memória. C # removeu tudo isso para você. Dito isso, Cocoa tem muitas APIs que ainda não estão tão acessíveis no Windows Phone. Como gestos, muito mais controles quando se trata de eventos de IU, etc ...
jyavenard
10

Claro, se tudo o que você viu em sua vida é Objective C, então sua sintaxe parece a única possível. Poderíamos chamá-lo de "virgem de programação".

Mas como muitos códigos são escritos em C, C ++, Java, JavaScript, Pascal e outras linguagens, você verá que ObjectiveC é diferente de todos eles, mas não de um jeito bom. Eles tinham um motivo para isso? Vamos ver outras linguagens populares:

C ++ adicionou muitos extras ao C, mas mudou a sintaxe original apenas o necessário.

C # adicionou muitos extras em comparação com C ++, mas mudou apenas coisas que eram feias em C ++ (como remover o "::" da interface).

Java mudou muitas coisas, mas manteve a sintaxe familiar, exceto nas partes em que a mudança era necessária.

JavaScript é uma linguagem completamente dinâmica que pode fazer muitas coisas que ObjectiveC não pode. Ainda assim, seus criadores não inventaram uma nova maneira de chamar métodos e passar parâmetros apenas para ser diferente do resto do mundo.

Visual Basic pode passar parâmetros fora de ordem, assim como ObjectiveC. Você pode nomear os parâmetros, mas também pode passá-los da maneira normal. O que quer que você use, é a forma normal delimitada por vírgulas que todos entendem. A vírgula é o delimitador usual, não apenas em linguagens de programação, mas em livros, jornais e linguagem escrita em geral.

Object Pascal tem uma sintaxe diferente de C, mas sua sintaxe é realmente MAIS FÁCIL de ler para o programador (talvez não para o computador, mas quem se importa com o que o computador pensa). Então, talvez eles tenham divagado, mas pelo menos o resultado é melhor.

Python tem uma sintaxe diferente, que é ainda mais fácil de ler (para humanos) do que Pascal. Então, quando eles mudaram, tornando-o diferente, pelo menos eles o tornaram melhor para nós, programadores.

E então temos ObjectiveC. Adicionando algumas melhorias ao C, mas inventando sua própria sintaxe de interface, chamada de método, passagem de parâmetro e tudo o mais. Eu me pergunto por que eles não trocaram + e - de modo que mais subtraia dois números. Teria sido ainda mais legal.

Steve Jobs estragou tudo ao apoiar ObjectiveC. Claro que ele não suporta C #, o que é melhor, mas pertence ao seu pior concorrente. Portanto, esta é uma decisão política, não prática. A tecnologia sempre sofre quando as decisões de tecnologia são feitas por razões políticas. Ele deve liderar a empresa, o que ele faz bem, e deixar as questões de programação para especialistas reais.

Tenho certeza de que haveria ainda mais aplicativos para iPhone se ele decidisse escrever iOS e oferecer suporte a bibliotecas em qualquer outra linguagem que não ObjectiveC. Para todos, exceto para os fãs obstinados, programadores virgens e Steve Jobs, ObjectiveC parece ridículo, feio e repulsivo.

user561168
fonte
3
os últimos 2 parágrafos somam tudo
Zakos
Sim, claro que a sintaxe parece ridícula, mas a joia da linguagem Objective-C é que ela tem o reflexo quase mais fácil de usar de todas as linguagens e alguns recursos de tempo de execução realmente brilhantes que tornam vários paradigmas quase triviais de implementar. Por exemplo, ao usar Objective-C, nunca preciso me preocupar com qual tabela linear usar - lista vinculada ou vetor ou o que quer que seja - apenas NSArraye ela lida com a seleção do melhor algoritmo com base na máquina e na natureza dos dados.
Maxthon Chan
Comecei meu primeiro trabalho como um programador (virgem) implementando interfaces de usuário iOS-App em Objective-C. Tudo o que quero por agora (depois de 3 anos) é sair dessa 'ilha' solitária e aprender algo mais independente de plataforma e, portanto, mais seminal. Também para saber se outros frameworks também são atualizados tão rapidamente - e com erros. Ei! Novo recurso! - Crash ... Espero que o centro de empregos (alemão) gaste algum dinheiro para mim em tutoriais em Java e / ou C ++ / C #, já que não quero mais desenvolver para Apple sh * t.
anneblue
5

Uma coisa que adoro no objetivo-c é que o sistema de objetos é baseado em mensagens, ele permite que você faça coisas realmente legais que você não poderia fazer em C # (pelo menos não até que eles suportem a palavra-chave dinâmica!).

Outra coisa excelente sobre como escrever aplicativos de cacau é o Interface Builder, muito mais agradável do que o designer de formulários no Visual Studio.

As coisas sobre obj-c que me incomodam (como um desenvolvedor C #) são o fato de que você tem que gerenciar sua própria memória (há coleta de lixo, mas isso não funciona no iPhone) e que pode ser muito prolixo por causa de a sintaxe do seletor e todos os [].

Jonnii
fonte
2
dynamicsó levará você até a metade - implementar um verdadeiro objeto dinâmico, mesmo com coisas triviais como delegação de mensagens, é entediante mesmo em C # 4.0. Por outro lado, o preço da flexibilidade verdadeira mensagem dinâmica que passa a la ObjC é a segurança de tipo perdida.
Pavel Minaev,
3
É importante ressaltar que Objective-C permite a tipagem estática opcional, o que oferece um grau muito maior de segurança de tipo. Algumas pessoas preferem a verificação em tempo de compilação, outras preferem a verificação em tempo de execução. O bom (em ambas as línguas) é que a escolha não precisa ser absoluta.
Quinn Taylor,
3
O designer do Windows Forms não é tão bom, mas se você é capaz de usar o WPF (a partir do .NET 3.0), o Expression Blend é difícil de bater ...
Nate
Você pode fazer muito isso com o System.Reflectioncombinado com extensões em C # 3.0, você pode chamar qualquer método que encontrar, mas não é a verdadeira passagem de mensagem, parecerá que obj.PassMessage("function_name", params object[] args);para uma melhor passagem de mensagem integrada à linguagem, o método ausente que pode ser chamado no objeto normal seria necessário.
Filip Kunc
4

Como um programador que está começando a usar Objective-C para iPhone, vindo do C # 4.0, estou perdendo as expressões lambda e, em particular, Linq-to-XML. As expressões lambda são específicas do C #, enquanto o Linq-to-XML é realmente mais um contraste .NET vs. Cocoa. Em um aplicativo de amostra que eu estava escrevendo, tinha algum XML em uma string. Eu queria analisar os elementos desse XML em uma coleção de objetos.

Para fazer isso em Objective-C / Cocoa, tive que usar a classe NSXmlParser . Esta classe depende de outro objeto que implementa o NSXMLParserDelegate protocolo com métodos que são chamados (ler: mensagens enviadas) quando uma tag de abertura de elemento é lida, quando alguns dados são lidos (geralmente dentro do elemento) e quando alguma tag de final de elemento é lida . Você deve acompanhar o status e o estado da análise. E, honestamente, não tenho ideia do que acontece se o XML for inválido. É ótimo para obter detalhes e otimizar o desempenho, mas, cara, isso é muito código.

Em contraste, aqui está o código em C #:

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

E é isso, você tem uma coleção de objetos personalizados extraídos de XML. Se você quiser filtrar esses elementos por valor, ou apenas aqueles que contêm um atributo específico, ou se você quiser apenas os 5 primeiros, ou pular o primeiro 1 e obter os próximos 3, ou apenas descobrir se algum elemento foi retornado ... BAM, tudo ali na mesma linha de código.

Existem muitas classes de software livre que tornam esse processamento muito mais fácil em Objective-C, então isso faz muito do trabalho pesado. Não é apenas isso embutido.

* NOTA: Na verdade, eu não compilei o código acima, ele serve apenas como um exemplo para ilustrar a relativa falta de detalhamento exigida pelo C #.

brentlightsey
fonte
É importante não notar aqui, porém, que não há tanta "falta de verbosidade" por parte do C # nesta comparação, apenas que a verbosidade está contida nas classes de estrutura .net que você está usando para analisar seu XML. Se você examinar o código dentro deles, provavelmente encontrará um código bem mais C #, possivelmente ainda mais detalhado.
XIVSolutions,
3

Provavelmente a diferença mais importante é o gerenciamento de memória. Com C # você obtém a coleta de lixo, em virtude de ser uma linguagem baseada em CLR. Com Objective-C, você precisa gerenciar a memória sozinho.

Se você está vindo de C # (ou qualquer linguagem moderna), mudar para uma linguagem sem gerenciamento automático de memória será realmente doloroso, pois você gastará muito do seu tempo de codificação gerenciando adequadamente a memória (e depurando como bem).

DSO
fonte
6
ObjC tem rastreamento de coleta de lixo nos dias de hoje. Por outro lado, o C # permite que você mesmo gerencie a memória se quiser (graças aos ponteiros brutos).
Pavel Minaev,
3
Não acho o gerenciamento manual de memória em Objective-C (no contexto dos frameworks da Apple) um fardo: o ciclo de retenção / liberação / liberação automática é muito menos complicado do que o gerenciamento de memória "tradicional" em C e C ++.
mipadi,
5
Isso simplesmente não é verdadeiro DSO - mesmo em um ambiente sem coleta de lixo como o iPhone, as coisas de retenção / liberação e liberação automática levam cerca de 10 minutos para serem aprendidas e então não é um problema. Eu encontrei muitos C #ers que gostam de exagerar nos desafios do gerenciamento de memória. É quase como se eles temessem começar a gostar demais de obj-c de outra forma ...;)
h4xxr
4
O básico do gerenciamento manual de memória não é difícil. Mas pode ficar complicado muito rápido quando você começa a passar objetos alocados e precisa lidar com gráficos de objetos complexos, porque você precisa seguir regras cuidadosamente como quem é responsável por liberar e quando. Implementações de contagem de referência tornam isso um pouco mais fácil, exceto que você precisa lidar com ciclos em gráficos de objetos ... em comparação com C #, tudo isso IMO é uma grande diferença.
DSO
1

Aqui está um artigo muito bom comparando os dois idiomas: http://www.coderetard.com/2008/03/16/c-vs-objective-c/

Cinder6
fonte
É uma pena que a página afirme estar em UTF-8, mas tenha todos os tipos de substituições desagradáveis ​​para apóstrofos e aspas. Acho que o texto dele usa aspas "curvas", mas com certeza distorcem o código ...
Quinn Taylor,
eles parecem ter roubado toda a sua introdução, mas até mesmo o artigo de origem teve seu código bloqueado. nenhum deles é um artigo particularmente bom.
dnord,
-2

Além da diferença de paradigma entre as 2 línguas, não há muita diferença. Por mais que eu odeie dizer isso, você pode fazer o mesmo tipo de coisas (provavelmente não tão facilmente) com .NET e C # como faria com Objective-C e Cocoa. A partir do Leopard, Objective-C 2.0 tem coleta de lixo, então você não precisa gerenciar a memória sozinho, a menos que queira (compatibilidade de código com Macs mais antigos e aplicativos do iPhone são 2 motivos para querer).

No que diz respeito ao código estruturado e legível, grande parte da carga recai sobre o programador, como acontece com qualquer outra linguagem. No entanto, acho que o paradigma de passagem de mensagem se presta bem a código legível, desde que você nomeie suas funções / métodos de forma adequada (novamente, como qualquer outra linguagem).

Serei o primeiro a admitir que não estou muito familiarizado com C # ou .NET. Mas as razões que Quinn listou acima são algumas razões pelas quais eu não me importo em me tornar assim.

alesplin
fonte
-3

As chamadas de método usadas em obj-c facilitam a leitura do código, na minha opinião muito mais elegante do que c # e obj-c é construído sobre c, portanto, todo código c deve funcionar bem em obj-c. O que mais me vende é que obj-c é um padrão aberto, então você pode encontrar compiladores para qualquer sistema.

kubi
fonte
2
ISO C # também é um padrão aberto. Além disso, até onde eu sei, o único compilador ObjC existente é o gcc.
Pavel Minaev,
@Pavel: Há também o Compilador de Objetos Portáteis ( users.telenet.be/stes/compiler.html ) e o clang.
mipadi,
1
Na verdade, o GCC não é mais o único compilador - Clang e LLVM são um par de tecnologias projetadas e desenvolvidas para substituir o GCC e fazer coisas que nunca poderia, incluindo a compilação JIT. Este é o cerne do OpenCL no Snow Leopard. Eles também são extensíveis a outras linguagens e vale a pena conferir.
Quinn Taylor,
2
Sinceramente, não consideraria a portabilidade um profissional do Objective-C. Em vez disso, os pontos fortes estão mais próximos das linhas de desenvolvimento rápido e volume reduzido de código para realizar a mesma tarefa.
Quinn Taylor,
Obrigado por corrigir meu erro sobre a disponibilidade do compilador. Bem, tecnicamente a portabilidade existe de qualquer maneira - posso usar MinGW / ObjC no Win32 perfeitamente, por exemplo - nesse sentido, é tão portátil quanto o próprio gcc. Claro, as bibliotecas não estarão lá (embora ... há GnuStep / Win32?), Mas esta situação não é realmente muito pior do que a que temos com Mono; Portanto, no geral, diria que a portabilidade não é um ponto forte para nenhum dos lados.
Pavel Minaev,