Categorias Objective-C

Às vezes, você pode descobrir que deseja estender uma classe existente, adicionando um comportamento que é útil apenas em certas situações. Para adicionar essa extensão às classes existentes, Objective-C fornececategories e extensions.

Se você precisar adicionar um método a uma classe existente, talvez, para adicionar funcionalidade para tornar mais fácil fazer algo em seu próprio aplicativo, a maneira mais fácil é usar uma categoria.

A sintaxe para declarar uma categoria usa a palavra-chave @interface, assim como uma descrição de classe Objective-C padrão, mas não indica qualquer herança de uma subclasse. Em vez disso, ele especifica o nome da categoria entre parênteses, como este -

@interface ClassName (CategoryName)

@end

Características da Categoria

  • Uma categoria pode ser declarada para qualquer classe, mesmo se você não tiver o código-fonte da implementação original.

  • Todos os métodos que você declarar em uma categoria estarão disponíveis para todas as instâncias da classe original, bem como quaisquer subclasses da classe original.

  • Em tempo de execução, não há diferença entre um método adicionado por uma categoria e um que é implementado pela classe original.

Agora, vamos dar uma olhada em um exemplo de implementação de categoria. Vamos adicionar uma categoria à classe NSString do Cocoa. Esta categoria possibilitará adicionar um novo método getCopyRightString que nos ajuda a retornar a string de copyright. É mostrado abaixo.

#import <Foundation/Foundation.h>

@interface NSString(MyAdditions)
+(NSString *)getCopyRightString;
@end

@implementation NSString(MyAdditions)

+(NSString *)getCopyRightString {
   return @"Copyright TutorialsPoint.com 2013";
}

@end

int main(int argc, const char * argv[]) {
   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   NSString *copyrightString = [NSString getCopyRightString];
   NSLog(@"Accessing Category: %@",copyrightString);
   
   [pool drain];
   return 0;
}

Agora, quando compilarmos e executarmos o programa, obteremos o seguinte resultado.

2013-09-22 21:19:12.125 Categories[340:303] Accessing Category: Copyright TutorialsPoint.com 2013

Mesmo que todos os métodos adicionados por uma categoria estejam disponíveis para todas as instâncias da classe e suas subclasses, você precisará importar o arquivo de cabeçalho da categoria em qualquer arquivo de código-fonte onde deseja usar os métodos adicionais, caso contrário, você encontrará avisos e erros do compilador.

Em nosso exemplo, uma vez que temos apenas uma única classe, não incluímos nenhum arquivo de cabeçalho, nesse caso devemos incluir os arquivos de cabeçalho conforme dito acima.