Resultados 1 a 7 de 7
  1. #1

    [Tutorial]01-Iniciando em Objective-C

    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:
    Código:
    NSString *nome;
    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:

    Código:
    Notas *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.

    Código:
    [notas release];
    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.

    Código:
    [pool drain];
    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!!!
    Skype:mayckonxp
    iChat:mayckon@mac.com

  2. #2
    Moderador Avatar de M4CK
    Data de Ingresso
    Jul 2007
    Posts
    2.809
    Fala mayckon !
    Achei legal a sua disposição em criar o tutorial para essa linguagem.
    Uma dica, para chamar a atenção de quem tiver interesse na linguagem, é montar um tutorial para "preparar o terreno" para programar, que seria citar o necessário para compilar os códigos, como preparar o ambiente e algumas IDE's por exemplo.
    Enfim, como não conheço essa linguagem, não sei mais o que pode ser implementado em um próximo tutorial.

    Enfim, obrigado por contribuir com a comunidade !
    Abraços !

  3. #3
    M4CK, obrigado pelas dicas, esqueci de postar, sou muito lerdo.
    Mas para programar nessa linguagem, precisa-se de duas coisas:
    Um Mac OS(ou um Hackintosh), e baixar o XCode do site da Apple.
    Essas são as ferramentas necessárias para programar nessa linguagem...
    Vou postar um tutorial sobre isso posteriormente. Valeu!!!
    Skype:mayckonxp
    iChat:mayckon@mac.com

  4. #4
    Moderador Avatar de M4CK
    Data de Ingresso
    Jul 2007
    Posts
    2.809
    Tranquilo cara !
    Andei dando uma pesquisadinha aqui, e pelo que me parece é possivel sim compilar e rodar a aplicação em outro ambiente que não seja um MacOS. E testei alguns casos aqui.
    Não testei no WIndows, porém parece que com o MinGW, é possivel estar compilando. Se não me engano é o compilador utilizado pelo Dev-C++.

    O GCC por si consegue compilar Objective-C, no Linux só precisei de um apt-get install gobjc
    E para a compilação, precisei passar o seguinte argumento: gcc programa.m -o programa -l objc

    E temos ...


    Bom, vou falar algo sobre o que andei lendo, se for alguma bobagem, você me corrige .. Ok ? hehe
    Algumas coisas não funcionaram por aqui, por exemplo o:
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]
    .
    E consequentemente o [pool drain].
    Que como você disse parece ser uma diretiva do compilador, deve então variar de compilador para compilador.
    Não sei se o Objective-C tem uma padrão como o padrão ANSI-C para C, mas há algum padrão para seguir ?

    A linha [notas release], também não compilou aqui, pode ser por conta do compilador ou algo assim, imagino eu.
    Uma pergunta, qual a diferença entre utilizar o release e o free, pois vi alguns exemplos utilizando o free para a liberação da memória.

    Precisei mudar o NSLog(@ pra printf(), pois também não consegui utilizá-lo aqui.
    Enfim, segue como ficou a codificação para rodar ele aqui, como disse .. os erros creio eu que devem ter ocorrido pelos motivos da IDE utilizada.

    Segue:
    main.m
    http://pastebin.com/fiV2SEdP

    Notas.m
    http://pastebin.com/P7UL5brJ

    Notas.h
    http://pastebin.com/M7Tw1afM

    Enfim, obrigado novamente pelo tutorial.
    Abraços !

  5. #5
    Ola M4CK,
    bom primeiramente eu não sei se você vai conseguir compilar programas em Objective-C utilizando o SDK do Objective-C fora do Mac OS. Porque o SDK vem junto com o XCode, então para poder utilizar o NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init], release, [pool drain], NSLog, você devia ter o SDK, por isso não conseguiu compilar e acabou que você teve de modificar para comandos de sintaxe C. Agora em releção a diferença entre usar o release e o free, é que o free é chamado apenas para liberar memória quando se utiliza a função malloc() ou outra função que esteja documentada para usar o free() no C. Para liberar objetos da memória em Objective-C devemos usar release, que é da classe NSObject e que é a mesma classe do alloc, que é o método responsável por alocar o objeto na memória. Em Objective-C, também podemos utilizar o método autorelease. Este é utilizado dentro de métodos e libera o objeto da memória logo após o método ter sido executado.

    Tente utilizar o Hackintosh, ai você poderá criar seus programas em Objective-C normalmente. Valeu!!!

    Ah, outra observação, esqueci de colocar no código principal. Importamos a biblioteca foundation para utilizar aqueles métodos.
    #import <Foundation/Foundation.h>
    #import "Notas.h"
    Última edição por M4CK; 27 Jul 2011 às 14:54.
    Skype:mayckonxp
    iChat:mayckon@mac.com

  6. #6
    Moderador Avatar de M4CK
    Data de Ingresso
    Jul 2007
    Posts
    2.809
    Valeu pelas explicações amigão.
    Tenho uma máquina parada aqui, vamos ver o que vou conseguir com ela.
    Mas vou estar acompanhando seus tópicos.

    Abraços !

  7. #7
    Gray Hat Avatar de CoderSc
    Data de Ingresso
    Jan 2011
    Localização
    #!/bin/bash
    Posts
    1.736
    Muito legal o tutorial parabens !!! ^Flw !
    Når du føler flove over at se på tras eller bange for at se fremad, se venstre eller højre I be altid ved din side.

    H
    aters Gonna Hate

Permissões de Postagem

  • Você não pode iniciar novos tópicos
  • Você não pode enviar respostas
  • Você não pode enviar anexos
  • Você não pode editar suas mensagens
  •