Como todos já sabem a Apple vem cada vez mais ganhando espaço no mercado com seus novos produtos, tanto com tablets(iOS) quanto com computadores(Mac OS). E com ela também surge novas oportunidades de emprego em uma área muito promissora e de futuro.
Neste tópico irei abordar o básico sobre Objective-C(linguagem universal para desenvolver para produtos Apple) e vocês verão que não é uma linguagem complicada, se parece um pouco com o C. Eu disse um pouco... rs
Introdução
A linguagem Objective-C é uma linguagem orientada a objetos que surgiu na década de 80. Foi adotada pela Apple como a linguagem principal para o desenvolvimento de seus aplicativos(Mac OS, iPhone, iPad, iPod). Objective-C possui características do C(flexibilidade, acesso a ponteiros e gerenciamento de memória) e do Smalltalk(Orientação a objetos). O uso de objetos e padrões de design orientado a objetos é fundamental para o desenvolvimento de aplicações utilizando o Cocoa Touch(framework de desenvolvimento para iPhone). Muitos dos tradicionais conceitos de orientação a objetos como encapsulamento, herança, polimorfismo e interface, estão presentes em Objective-C. Objective-C é um super conjunto da versão ANSI da linguagem de programação C e suporta a mesma sintaxe básica do C. Tal como acontece com o código C, você define seus arquivos de cabeçalho e arquivos de origem para separar as declarações públicas dos detalhes de implementação do seu código. Agora vamos ver alguns códigos para entender um pouco mais sobre esta linguagem...
Classes
As classes em Objective-C são divididas em duas partes: Arquivo de cabeçalho e Arquivo de implementação.
Arquivos de cabeçalho:Possuem as variáveis e os métodos da classe. Porém possui apenas a cabeça(declaração) dos métodos. Arquivos de cabeçalho possuem uma extensão .h. Exemplo:
Código:
@interface MinhaClasse: NSObject
{
//variaveis
int count;
NSString *nome;
}
// Métodos
-(void)realizaCalculo:(int) p;
+(BOOL) verificaAcao;
@end
Explicando: Na primeira linha declaramos:
Código:
@interface MinhaClasse: NSObject
Para declararmos um arquivo de cabeçalho(.h) devemos iniciar com a sintaxe interface NomeDaClasse: NSObject. Os dois pontos(
seguidos de NSObject quer dizer que a interface está herdando da classe NSObject.
TODAS as classes em Objective-C herdam da classe NSObject implícitamente, porém ao criarmos um arquivos de cabeçalho devemos implementar esta declaração(lembrando que o XCode que é a IDE do Objective-C já implementa essa declaração ao criar uma nova classe).
Abordarei mais sobre herança em um outro tópico, mas apenas para esclarecer herança em Objective-C é assim:
Código:
@interface Classe:ClassePai
Como vocês perceberam apenas as variáveis ficam contidas dentro das chaves da classe.
Código:
@interface MinhaClasse: NSObject
{
//variaveis
int count;
NSString *nome; // ponteiro
}
Assim como no C, Objective-C tem suporte a ponteiros. Todos objeto em Objective-C é um ponteiro, apenas os tipos primitivos(int,float,char) escapam desta regra.
Observe a linha:
NSString é uma classe que possui vários métodos que permitem trabalhar com objetos do tipo String(métodos de comparação, inicialização e etc) que veremos em tópicos posteriores.
Para criarmos métodos em Objective-C, devemos declará-los fora das chaves e antes do @end.
Código:
@interface MinhaClasse: NSObject
{
//variaveis
int count;
NSString *nome;
}
// Métodos
-(void)realizaCalculo:(int) p;
+(BOOL) verificaAcao;
@end
Métodos em Objective-C: como vimos acima o primeiro método inicia com -(void). O traço(-) quer dizer que este método é um método de instância, ou seja, ao criarmos um objeto do tipo MinhaClasse, poderemos acessar este método, (void) quer dizer que ele não possui um valor de retorno. O método realizaCalculo está recebendo um parametro do tipo int, que se chama p. Então para enviar um parâmetro para um método, basta fazer da seguinte maneira:
Código:
-(tipoDeRetorno)NomeDoMetodo:(tipoDoParametro)nomeDoParametro;
Para um método que recebe mais de um valor de retorno, podemos fazer da seguinte maneira:
Código:
-(tipoDeRetorno)nomeDoMetodo:(int) p :(char)c;
O segundo método +(BOOL) verificaAcao é um método de classe, pois inicia com o mais(+), ou seja, este método não pode ser acessado por uma referência da classe, ele pode ser acessado apenas de dentro da própria classe. Ele retorna um tipo booleano(BOOL).
Arquivos de implementação:possui a implementação dos métodos criados na @interface.
Código:
@implementation MinhaClasse
-(void)realizaCalculo:(int) p : (char)c
{
// implementação
}
+(BOOL) verificaAcao
{
// implementação
}
@end
Explicando: como vocês podem perceber, já não é necessário declarar que a implementação herda de NSObject, porque esta declaração é feita apenas na @interface . Como vimos acima, começamos com a sintaxe:
Código:
@implementation MinhaClasse
para informar à IDE que estamos implementando a nossa classe. Outra observação é que na implementação não se deve usar chaves como na @interface. As chaves são usadas, assim como no C, apenas para informar o início e o fim de um método.
Trabalhando no Console
Para receber e mostrar dados, usamos uma sintaxe semelhante ao do C.
Para informar uma mensagem no console, devemos utilizar:
Código:
NSLog(@"Hello World");
Este arroba definido antes da mensagem foi definido como padrão pelos criadores da Linguagem. Então devemos utilizar sempre o arroba para exibir uma mensagem com o comando NSLog.
Para ler um valor, fazemos da seguinte maneira:
Código:
scanf("%i",&variavel);
Utilizamos o & antes da variável porque scanf() armazena valores e por isso precisa de um lugar para armazená-los. Isto é feito fornecendo os endereços(em ponteiros) de onde armazenar os valores.
Tipos de Dados
Tipos de dados primitivos.(veremos outros tipos de dados em outros tópicos)
Código:
int
float
double
char
BOOL
Programa Exemplo
1- Um programa que lê as notas do aluno e informa se ele passou, considerando que a nota é 6.0.
Interface(Notas.h)
Código:
@interface Notas:NSObject
{
float n1,n2,n3,n4,media;
}
// metodos acessores
-(void)setN1:(float)nota1;
-(void)setN2:(float)nota2;
-(void)setN3:(float)nota3;
-(void)setN4:(float)nota4;
// metodo que calcula e retorna a nota
-(float)calculaNota;
@end
Implementation(Notas.m):
Código:
@implementation Notas
-(void)setN1:(float)nota1
{
n1 = nota1;
}
-(void)setN2:(float)nota2
{
n2 = nota2;
}
-(void)setN3:(float)nota3
{
n3 = nota3;
}
-(void)setN4:(float)nota4
{
n4 = nota4;
}
-(float)calculaNota
{
media = (n1+n2+n3+n4)/4;
return media;
}
@end
Método Principal:
Código:
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Notas *notas = [[Notas alloc]init];
float n1,n2,n3,n4;
NSLog(@"Informe a primeira nota do aluno");
scanf("%f",&n1);
NSLog(@"Informe a segunda nota do aluno");
scanf("%f",&n2);
NSLog(@"Informe a terceira nota do aluno");
scanf("%f",&n3);
NSLog(@"Informe a quarta nota do aluno");
scanf("%f",&n4);
[notas setN1:n1];
[notas setN2:n2];
[notas setN3:n3];
[notas setN4:n4];
if([notas calculaNota]>6)
{
NSLog(@"Aluno aprovado. Nota: %2.0f",[notas calculaNota]);
}
else {
NSLog(@"Aluno reprovado. Nota: %2.0f",[notas calculaNota]);
}
[notas release];
[pool drain];
return 0;
}
Explicando o método principal: A linha de código que contem o objeto pool, é criada automaticamente pela IDE, para alocar um espaço na memória para nossa aplicação.
Código:
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Falarei mais sobre isso em outro post.
Aqui criamos uma referencias do tipo Notas:
Aqui alocamos a referencia na memória:
Código:
Notas *notas = [[Notas alloc]
Aqui criamos um novo objeto do tipo notas, alocamos na memória e inicializamos o nosso objeto
Código:
Notas *notas = [[Notas alloc]init];
O método release serve para desalocar o objeto da memória. Como a memória do iPhone ou iPad é limitada, temos que ter muito cuidado ao alocarmos objetos, devemos lembrar sempre de liberar a memória desses objetos para não ocorrer um vasamento de memória.
O método drain funciona da mesma forma do release. Mas para liberar objetos do tipo NSAutoreleasePool da memória, devemos utilizar drain, caso contrário teremos uma erro em nosso programa.
Lembrando que todos esses métodos(alloc, init, drain) são herdados da classe NSObject.
Bom, é isso ai pessoal, sugestões e críticas são bem vindas. Sempre que puder eu vou postar mais ai pra galera. Valeu!!!