Objective-C, denominada frequentemente de ObjC ou mais raramente de Objective C ou Obj-C, é uma linguagem simples de computador, projetada para permitir uma programação orientada a objetos sotisficada, é derivada do Smalltalk uma das primeiras linguagens orientadas a objetos e é também um conjunto de adições à linguagem C, dando ao C suporte à construções orientadas a objetos como as da Smalltalk.
O ObjC foi criado principalmente por Brad Cox e Tom Love no início da década de 1980 na empresa deles, a Stepstone. Brad havia tido seu interesse despertado por problemas de reusabilidade em projeto de software e programação. Para demonstrar que uma melhora satisfatória podia ser feita, Cox provou que componentes de software necessitavam apenas de umas poucas mudanças práticas nas ferramentas existentes. Precisando apenas dar suporte a objetos de modo flexível, possuindo um conjunto de bibliotecas funcionais e permitindo que fossem empacotados num único formato multiplataforma. E então em meados da década de 80, junto com Tom Love ele criou a linguagem Objective C baseado nos seus estudos.
A primeira publicação oficial falando sobre o Objective-C foi escrita em 1986 no livro de Brad Cox, “Programação Orientada a Objetos, Uma Abordagem Evolutiva”. Nele Brad destacou que o problema maior está na reusabilidade e não na linguagem.
Nos anos 90, Steve Jobs foi demitido da Apple e fez alguns investimentos. Entre eles, adquiriu parte de uma nova empresa, a NeXT. A NeXT licenciou o Objective-C da StepStone e liberou uma versão própria do compilador e das bibliotecas das linguagens, nas quais a interface do usuário e da estrutura NeXTstep eram baseadas. As ferramentas e a qualidade do sistema operacional fizeram com que a NEXT ocupasse uma parte muito popular do nicho das estações de trabalho.
Na volta de Jobs para a Apple em 1996, foi exigido que a Next fosse comprada, Jobs assumiu a frente dos negócios da Apple e reformulou vários produtos. Entre eles o próprio SO, que estava defasado em relação aos outros. E para ser realizada essa reformulação, a linguagem escolhida foi justamente o Objective C, sendo criado assim o Mac OS X.
A linguagem é derivada diretamente do C, a maior parte de sua sintaxe (incluindo pré-processamento, expressões, declaração e chamadas de funções) foi herdada da linguagem C ,com algumas características de Smalltalk, como o uso de parâmetros dentro do nome do método em vez de em seção de parâmetros no mesmo. Atualmente, é utilizada principalmente no Mac OS X e GNUstep, que são dois ambientes inspirados no padrão OpenStep sendo a principal linguagem utilizada nos aplicativos estruturais NeXTSTEP, OPENSTEP e Cocoa (versão da Apple do ambiente de desenvolvimento NeXtstep com algumas melhorias).
Objective-C suporta polimorfismo, posing, categorias, e é uma linguagem dinâmica, com typing e binding dinâmicos. Com Objective-C você pode adicionar classes e categorias em tempo de execução de forma fácil. Objective-C realiza chamadas de mensagem dinâmicas rapidamente, entre 1,5 e 2,0 vezes o tempo de uma chamada de função em C.
A linguagem Objective-C foi a que mais cresceu em popularidade em 2011 (+3,91 pontos percentuais), após ter estado muito próxima disso nos 2 anos anteriores. O relatório atribui este resultado ao sucesso do iPhone e iPad, cujo desenvolvimento de aplicativos ocorre quase exclusivamente nesta linguagem e nas tecnologias associadas a ela.
Para programar em Objective-C, tal como em qualquer outra linguagem moderna, você precisa de um editor e um compilador. Ambos estão disponíveis gratuitamente em muitos dos sistemas operacionais atuais.
Nos três sistemas, compilar um programa utilizando a linha de comando resume-se ao gcc (para projetos maiores costuma-se utilizar ferramentas como make, automake, etc), cujo formato geral de chamada é:
gcc arquivos.m -o nome_do_programa -l objc
•gcc: Indica que usaremos o compilador gcc
•arquivos.m: nome do arquivo do programa
•-o : vem de output, indica qual nome o arquivo executável vai ter
•-l objc: O -l vem de library (biblioteca) -lobjc indica que usaremos as bibliotecas do objective-c para compilar o nosso programa.
Os arquivos de código da linguagem Objective-C possuem sufixo ”.m”, enquanto que os cabeçários possuem, como em C, sufixo ”.h”.
A diretriz denominada ”#import”, que serve para substituir ”#include” de forma a não ser necessário escrever ”#ifndef #define #endif” para não incluir o mesmo arquivo várias vezes, e com isso as versões do gcc utilizadas em computadores com Linux e Windows dão “Warnings” na hora de compilar. Para acabar com esse problema, utilize a chamada do gcc com ”-Wno-import”. Computadores com o gcc fornecido pela Apple não sofrem desse problema.Para compilar programas utilizando o Xcode da Apple você deve criar um novo projeto do tipo “Cocoa Application” e sobrescrever o arquivo “main.m” que será criado automaticamente.
O Objective C foi construído sobre a linguagem C, constituindo-se como um super-conjunto de C, sendo possível compilar qualquer programa C em um compilador de Objective C. A maior parte da sua sintaxe deriva do C, enquanto os aspectos de orientação a objetos foram inspirados no estilo de passagens de mensagens do Smalltalk. Quem já tem experiência com C ou C++ vai verificar algumas características parecidas.
Programa em Objective C:
hello.m #import <stdio.h> int main( int argc, const char *argv[] ) { printf( "hello world\n" ); return 0; } Saida: hello world • #import em vez de #include em Objective-C; • A extensão de arquivo padrão para Objective-C é .m;
- Classes:
Como em muitas outras linguagens orientadas a objetos, as classes em Objective-C fornecem a estrutura básica para encapsular alguns dados com ações que atuam nesses dados. Um objeto é uma instância em tempo de execução de uma classe, e contém sua própria cópia das variáveis instânciadas pela classe e ponteiros para os metódos da classe.
A especificação de uma classe em Objective-C necessita de duas partes distintas: a interface e a implementação. A interface é a parte que contém a declaração e define as variáveis que serão instanciadas e os metódos associados com a classe. A interface é normalmente colocada num arquivo .h. A implementação é a parte que contém o código dos metódos da classe. A implementação é colocada em um arquivo .m.
A Figura abaixo mostra a sintaxe para a declaração de uma classe chamada MyClass, que herda caracteristicas da classe base do Cocoa, NSObject. A declaração da classe começa com a diretiva de compilador @interface e termina com a diretiva @end. Logo após o nome da classe (e separado dele por dois pontos) fica o nome da classe-pai. As variáveis de instância da classe são declaradas em um bloco de código delineado por chaves ( { e } ). Após o bloco de variáveis fica a lista de metódos declaradas pela classe. Um ponto-e-virgula marca o fim de cada declaração de variavel ou metódo.
O Objective-C suporta tanto tipificação fraca quanto forte para as variáveis do objeto. Variáveis com tipificação forte incluem o nome da classe na declaração do tipo da variável. Variáveis com tipificação fraca usam o tipo id. Variáveis com tipificação fraca são usadas normalmente para coisas como coleção de classes, onde o tipo exato do objeto em uma coleção pode ser desconhecido. Quem sempre usou linguagens de tipificação forte, pode achar que o uso de tipificação fraca poderia causar problemas, mas esse tipo fornece uma tremenda flexibilidade e permite um enorme dinamismo em programas Objective-C.
O exemplo abaixo mostra exemplos de tipificação forte e fraca:
MyClass *myObject1; // Strong typing id myObject2; // Weak typing
Observe o asterisco na primeira declaração. No Objective-C, referências para objetos são ponteiros. Coloca-se o asterisco na frente dos nomes de variáveis para declarações de objetos com tipificação forte. O tipo id implica um ponteiro.
- Metódos:
Uma classe no Objective-C pode declarar dois tipos de metódos:
• Metódos de instância: Um metódo de instância é um metódo cuja execução é associada a uma particular instância da classe. Em outras palavras, antes que possa chamar um metódo de instância, precisa criar primeiro uma instância da classe.
• Metódos de classe: Metódos de classe, ao contrário, não requerem a criação de uma instância da classe.
A declaração de um metódo consiste de um identificador do tipo do metódo, um tipo de retorno, uma ou mais palavras-chaves, e o tipo do parâmetro e informação do nome. A Figura abaixo mostra a declaração do metódo de instãncia insertObject:atIndex.
- Strings:
Como um sub-conjunto de C, o Objective-C suporta as mesmas convenções para especificação de string que o C. Em outras palavras, caracteres individuais são encapsulados por aspa única, e cadeias de caracteres são cercadas por aspas duplas. Todavia, o framework do Objective-C tipicamente não usa string no estilo C. Ao invés disso, ele passa strings através de objetos NSString.
A classe NSString fornece um invólucro para strings, incluindo gerenciamento de memória para armazenar strings de tamanho arbitrário, suporte a Unicode, utilitários de formatação estilo printf, e mais. Já que string são muito usadas, o Objective-C fornece uma notação curta para criar objetos NSString a partir de valores constantes. Para usar esse atalho, tudo que se tem que fazer é preceder uma string normal com aspas duplas com o simbolo @, como mostrado abaixo:
NSString *myString = @"My String\n"; NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
- Polimorfismo, Typing dinâmico e Binding dinâmico:
Polimorfismo é um conceito muito simples. Ele nada mais é do que a habilidade que uma linguagem orientada à objetos tem de definir métodos com o mesmo nome para classes diferentes. Cada definição de classe guarda o código necessário para seus métodos.Typing dinâmico é a característica que a linguagem tem de poder postergar a determinação da classe de um objeto até o tempo de execução do programa, enquanto que Biding dinâmico é poder postergar a determinação do método que será invocado em um objeto até o tempo de execução. Para realizar o typing e o binding dinâmicos utiliza-se o tipo id. Este é um tipo de objeto genérico, que pode ser utilizado para guardar objetos pertencentes a qualquer classe.
Em 2006 na Worldwide Developers Conference, a Apple anunciou o lançamento do “Objective-C 2.0”, uma versão da linguagem Objective -C que inclui: Coletor de lixo moderno, sintaxe reforçada , melhorias de performance na execução e suporte a 64-bits. O Mac OS X v10.5, liberado em outubro de 2007, inclui um compilador Objective-C 2.0, “dot syntax”, enumeração rápida, métodos de protocolos opcional, atributos em métodos/protocolos/classes, classes de extensão e o novo GNUnn Objective-C runtime API.