Aprenda Objective-C

  • Página Inicial
  • Contato!
  • Tudo sobre Objective-C Parte 1!
  • Tudo sobre Objective-C Parte 2!
  • Tudo sobre Objective-C Parte 3!
  • Tudo sobre Objective-C Parte 4!
  • Orientação a Objetos em Objective-C - Parte 1

    Criando Classes e Objetos

    Basicamente, criamos uma classe assim:

    
    #import <Foundation/Foundation.h>
    
    // Declaração dos atributos e métodos
    @interface Telefone : NSObject { // Toda classe obrigatoriamente herda de NSObject
        // Local dos atributos privados
    }
    
    @end
    
    // Tudo acima podemos colocar num arquivo .h, e abaixo num arquivo .m com um include:
    
    @implementation Telefone // Implementação dos métodos descritos na interface
    
    @end
    
    

    Para criar um objeto dessa classe, basta isso:

    
    Telefone *tel = [[Telefone alloc] init];
    
    

    Podemos adicionar atributos e métodos na classe, assim:

    
    @interface Telefone : NSObject {
        NSString *numero;
        NSString *operadora;
    }
    
    // Isso torna os atributos públicos:
    @property(nonatomic, retain) NSString *numero;
    @property(nonatomic, retain) NSString *operadora;
    
    // Declaração dos métodos:
    -(void) dados;
    @end
    
    @implementation Telefone
    
    // Isso também é necessário pra tornar os atributos públicos:
    @synthesize numero;
    @synthesize operadora;
    
    -(void) dados {
        NSLog(@"O número é %@ e a operadora é a %@.", [self numero], [self operadora]);
    }
    @end
    
    

    O self é como o "this" de outras linguagens, ou seja, auto-referência ao objeto criado.

    Dessa forma, podemos fazer as modificações assim:

    
    Telefone *tel = [[Telefone alloc] init];
    
    tel.numero = @"123-4567";
    tel.operadora = @"Vivo";
    
    [tel dados];
    
    

    Quando criamos uma classe, temos mais trabalho para fazê-la, mas depois que ela está pronta, podemos criar quantos objetos precisarmos vindos dessa mesma classe, e o programa principal fica mais simples, menor e mais natural. Os objetos criados dessa mesma classe são independentes entre si e o status de um não interfere no outro. Essa é uma das vantagens da orientação a objetos.

    PS: Caso precise declarar um objeto como nulo, use nil. E para pegar o nome da classe, use [self class].

    Encapsulamento e Construtor

    Para marcar atributos como privados, basta retirar as linhas de @property de interface e de @synthesize de implementation, assim:

    
    @interface Telefone : NSObject {
        NSString *numero;
        NSString *operadora;
    }
    
    -(void) dados;
    @end
    
    @implementation Telefone
    -(void) dados {
        NSLog(@"O número é %@ e a operadora é a %@.", numero, operadora); // Retire o "self" para privados
    }
    @end
    
    

    Dessa forma, só poderemos mexer nele através de métodos getters e setters, por exemplo:

    
    @interface Telefone : NSObject {
        NSString *numero;
        NSString *operadora;
    }
    
    -(void) dados;
    
    // Getters e setters
    -(NSString *) getNumero;
    -(NSString *) getOperadora;
    -(void) setNumero: (NSString *) _numero;
    -(void) setOperadora: (NSString *) _operadora;
    @end
    
    @implementation Telefone
    
    -(void) dados {
        NSLog(@"O número é %@ e a operadora é a %@.", numero, operadora);
    }
    
    -(NSString *) getNumero {
        return numero;
    }
    
    -(NSString *) getOperadora {
        return operadora;
    }
    
    -(void) setNumero: (NSString *) _numero {
        numero = _numero;
    }
    
    -(void) setOperadora: (NSString *) _operadora {
        operadora = _operadora;
    }
    @end
    
    

    PS: Atributos privados não utilizam o "self" nem algo equivalente.

    Para definirmos construtor, usamos o método init, e o destrutor com dealloc, assim:

    
    @interface Telefone : NSObject {
        NSString *numero;
        NSString *operadora;
    }
    
    -(void) dados;
    
    // Construtor
    -(id) init: (NSString *) _numero: (NSString *) _operadora;
    
    // Destrutor
    -(void) dealloc;
    
    // Getters e setters
    -(NSString *) getNumero;
    -(NSString *) getOperadora;
    -(void) setNumero: (NSString *) _numero;
    -(void) setOperadora: (NSString *) _operadora;
    @end
    
    @implementation Telefone
    -(void) dados {
        NSLog(@"O número é %@ e a operadora é a %@.", numero, operadora);
    }
    
    -(id) init: (NSString *) _numero: (NSString *) _operadora {
        numero = _numero;
        operadora = _operadora;
    }
    
    -(void) dealloc {
    
    }
    
    -(NSString *) getNumero {
        return numero;
    }
    
    -(NSString *) getOperadora {
        return operadora;
    }
    
    -(void) setNumero: (NSString *) _numero {
        numero = _numero;
    }
    
    -(void) setOperadora: (NSString *) _operadora {
        operadora = _operadora;
    }
    @end
    
    

    E na criação do objeto:

    
    Telefone *tel = [[Telefone alloc] init: @"123-4567": @"Vivo"];
    
    [tel dados];
    
    free(tel); // Destruição do objeto
    
    

    Atributos e Métodos Estáticos

    Os atributos estáticos são definidos declarando o static na frente, e métodos estáticos são definidos com um + no lugar do -. Veja um exemplo:

    
    @interface Numeros : NSObject {
        int num; // Caso queira público, retire essa linha e coloque +(int) num; fora desse bloco, igual a um método
    }
    
    +(void) apresentacao;
    +(int) getNum;
    +(void) setNum: (int) _num;
    @end
    
    static int num = 50; // Só aqui declara "static" e inicializa ele
    
    @implementation Numeros
    +(void) apresentacao {
        NSLog(@"O número é %d.", num);
    }
    +(int) getNum {
        return num;
    }
    +(void) setNum: (int) _num {
        num = _num;
    }
    @end
    
    

    E para exibir:

    
    [Numeros setNum: 100];
    
    [Numeros apresentacao];
    
    

    PS: Métodos estáticos só podem trabalhar outros métodos e atributos quando estes também forem estáticos, e não podem ser sobrepostos. E atributos estáticos é recomendável eles serem inicializados.