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]
.
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
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.