Classes e objetos Objective-C
O objetivo principal da linguagem de programação Objective-C é adicionar orientação a objetos à linguagem de programação C e as classes são o recurso central do Objective-C que suportam a programação orientada a objetos e são freqüentemente chamados de tipos definidos pelo usuário.
Uma classe é usada para especificar a forma de um objeto e combina representação de dados e métodos para manipular esses dados em um pacote organizado. Os dados e métodos dentro de uma classe são chamados de membros da classe.
Característica Objective-C
A classe é definida em duas seções diferentes, a saber @interface e @implementation.
Quase tudo está na forma de objetos.
Os objetos recebem mensagens e os objetos são freqüentemente chamados de receptores.
Os objetos contêm variáveis de instância.
Objetos e variáveis de instância têm escopo.
As classes ocultam a implementação de um objeto.
Propriedades são usadas para fornecer acesso a variáveis de instância de classe em outras classes.
Definições de classe Objective-C
Ao definir uma classe, você define um blueprint para um tipo de dados. Na verdade, isso não define nenhum dado, mas define o que significa o nome da classe, ou seja, em que consistirá um objeto da classe e quais operações podem ser executadas nesse objeto.
Uma definição de classe começa com a palavra-chave @interfaceseguido pelo nome da interface (classe); e o corpo da classe, delimitado por um par de chaves. Em Objective-C, todas as classes são derivadas da classe base chamadaNSObject. É a superclasse de todas as classes Objective-C. Ele fornece métodos básicos como alocação e inicialização de memória. Por exemplo, definimos o tipo de dados Box usando a palavra-chaveclass como segue -
@interface Box:NSObject {
//Instance variables
double length; // Length of a box
double breadth; // Breadth of a box
}
@property(nonatomic, readwrite) double height; // Property
@end
As variáveis de instância são privadas e só podem ser acessadas dentro da implementação da classe.
Alocando e inicializando objetos Objective-C
Uma classe fornece os blueprints para objetos, portanto, basicamente, um objeto é criado a partir de uma classe. Declaramos objetos de uma classe exatamente com o mesmo tipo de declaração com que declaramos variáveis de tipos básicos. As seguintes declarações declaram dois objetos da classe Box -
Box box1 = [[Box alloc]init]; // Create box1 object of type Box
Box box2 = [[Box alloc]init]; // Create box2 object of type Box
Ambos os objetos box1 e box2 terão sua própria cópia dos membros de dados.
Acessando os Membros de Dados
As propriedades dos objetos de uma classe podem ser acessadas usando o operador de acesso direto ao membro (.). Vamos tentar o seguinte exemplo para deixar as coisas claras -
#import <Foundation/Foundation.h>
@interface Box:NSObject {
double length; // Length of a box
double breadth; // Breadth of a box
double height; // Height of a box
}
@property(nonatomic, readwrite) double height; // Property
-(double) volume;
@end
@implementation Box
@synthesize height;
-(id)init {
self = [super init];
length = 1.0;
breadth = 1.0;
return self;
}
-(double) volume {
return length*breadth*height;
}
@end
int main() {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Box *box1 = [[Box alloc]init]; // Create box1 object of type Box
Box *box2 = [[Box alloc]init]; // Create box2 object of type Box
double volume = 0.0; // Store the volume of a box here
// box 1 specification
box1.height = 5.0;
// box 2 specification
box2.height = 10.0;
// volume of box 1
volume = [box1 volume];
NSLog(@"Volume of Box1 : %f", volume);
// volume of box 2
volume = [box2 volume];
NSLog(@"Volume of Box2 : %f", volume);
[pool drain];
return 0;
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
2013-09-22 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000
2013-09-22 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000
Propriedades
As propriedades são introduzidas em Objective-C para garantir que a variável de instância da classe possa ser acessada fora da classe.
As várias partes da declaração de propriedade são as seguintes.Propriedades começam com @property, que é uma palavra-chave
Ele é seguido por especificadores de acesso, que são não atômicos ou atômicos, de leitura ou somente leitura e fortes, inseguros não retidos ou fracos. Isso varia de acordo com o tipo da variável. Para qualquer tipo de ponteiro, podemos usar forte, unsafe_unretained ou fraco. Da mesma forma, para outros tipos, podemos usar readwrite ou readonly.
Isso é seguido pelo tipo de dados da variável.
Por fim, temos o nome da propriedade terminado por um ponto e vírgula.
Podemos adicionar instrução de síntese na classe de implementação. Mas no XCode mais recente, a parte de síntese é cuidada pelo XCode e você não precisa incluir a instrução de síntese.
Só é possível com as propriedades que podemos acessar as variáveis de instância da classe. Na verdade, os métodos getter e setter internos são criados para as propriedades.
Por exemplo, vamos supor que temos uma propriedade @property (nonatomic ,readonly ) BOOL isDone. Sob o capô, existem setters e getters criados conforme mostrado abaixo.
-(void)setIsDone(BOOL)isDone;
-(BOOL)isDone;