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;