Qual é a diferença entre uma categoria e uma extensão de classe. Acredito que ambos são usados para adicionar métodos personalizados em classes existentes. Alguém pode esclarecer isso? A exemplificação com código será muito apreciada.
objective-c
Abhinav
fonte
fonte
Respostas:
Uma categoria é uma forma de adicionar métodos às classes existentes. Eles geralmente residem em arquivos chamados "Class + CategoryName.h", como "NSView + CustomAdditions.h" (e .m, é claro).
Uma extensão de classe é uma categoria, exceto por 2 diferenças principais:
A categoria não tem nome. É declarado assim:
@interface SomeClass ()
@fimA implementação da extensão deve estar no bloco @implementation principal do arquivo.
É bastante comum ver uma extensão de classe no topo de um arquivo .m declarando mais métodos na classe, que são então implementados abaixo na seção @implementation principal da classe. Esta é uma forma de declarar métodos "pseudo-privados" (pseudo-privados porque não são realmente privados, apenas não são expostos externamente).
fonte
=> Em Objective C, quando você deseja adicionar mais alguma funcionalidade a uma classe sem herança, você simplesmente usa categoria para isso.
=> vem com seu próprio arquivo .h e .m
=>
Category
usa para adicionar novos métodos, não propriedades.-> In Objective C, when you want to make behaviour of some property private you use class extension. -> it comes with **.h** file only. -> mainly for properties.
@interface className (categoryName) @end
-Você obterá dois arquivos .h e .m com nome de arquivo como ( className + categoryName.h e className + categoryName.m )
e no caso de extensão você obterá
@interface className() @end
-Você obterá apenas um arquivo com o nome className_extensionName.h
fonte
Categoria é uma forma de adicionar métodos a uma classe, esteja o código-fonte disponível ou não, o que significa que você pode adicionar categoria a classes básicas como
NSString
e também às suas próprias classes personalizadas.A extensão só pode ser adicionada às classes cujo código-fonte está disponível porque o compilador compila o código-fonte e a extensão ao mesmo tempo.
Podemos adicionar variáveis de instância e propriedades extras na extensão da classe, mas não na categoria.
Qualquer variável e método dentro da extensão não é nem mesmo acessível para classes herdadas.
A categoria e a extensão são feitas basicamente para lidar com uma grande base de código, mas a categoria é uma maneira de estender a API de classe em vários arquivos de origem, enquanto a extensão é uma maneira de adicionar métodos necessários fora do arquivo de interface principal.
Use categoria quando você tiver que quebrar seu mesmo código de classe em diferentes arquivos de origem de acordo com diferentes funcionalidades, e extensão quando você precisar apenas adicionar alguns métodos necessários à classe existente fora do arquivo de interface principal. Além disso, quando você precisa modificar uma variável de instância declarada publicamente em uma classe, por exemplo, somente leitura para leitura e gravação, você pode declará-la novamente na extensão.
fonte
Extensão : Para tornar os métodos privados e adicionar propriedades de nossa própria classe personalizada, não da classe Apple.
Categoria : para adicionar mais métodos na classe existente, não na propriedade, pode ser usado tanto para a classe personalizada quanto para a classe Apple
NSString
.fonte
Também podemos ter propriedades usando definir propriedade associada na classe de categoria.
@interface SomeClass (Private) @property (nonatomic, assign) id newProperty; @end NSString * const kNewPropertyKey = @"kNewPropertyKey"; @implementation SomeClass (Private) @dynamic newProperty; - (void)setNewProperty:(id)aObject { objc_setAssociatedObject(self, kNewPropertyKey, aObject, OBJC_ASSOCIATION_ASSIGN); } - (id)newProperty { return objc_getAssociatedObject(self, kNewPropertyKey); } @end
Consulte: http://inchoo.net/dev-talk/ios-development/how-to-add-a-property-via-class-category/
fonte
@interface SomeClass () - (void) anAdditionalMethod; @end
Acho que não é a maneira de declarar categoria. A categoria deve ter um nome
@interface SomeClass (XYZ) - (void) anAdditionalMethod; @end
por exemplo
@interface NSMutableArray (NSMutableArrayCreation) + (id)arrayWithCapacity:(NSUInteger)numItems; - (id)initWithCapacity:(NSUInteger)numItems; @end
Declarado para NSMutableArray pela Apple
fonte
extensão ios semelhante a c #, classe abstrata java ou
categoria ios interface semelhante a c #, extensão de classe java
fonte
Categorias
As categorias são usadas quando você está criando um arquivo contendo um grande número de métodos. Portanto, elas fornecem a você a facilidade de quebrar uma única classe em módulos diferentes. Além disso, se forem feitas alterações nas categorias, o compilador não perderá tempo para compilar todo o projeto .Categorias não são capazes de adicionar novas variáveis ou propriedades e pesquisar sua classe pai. Você pode substituir um método em uma categoria, mas não é uma boa ideia porque o método não pode ser substituído posteriormente. Também o fluxo pode ser afetado porque todas as categorias o mesmo nível hierárquico e, portanto, duas categorias pertencentes à mesma classe pai podem existir em tempo de execução. Também métodos protegidos podem ser criados usando categorias
Extensões
As extensões permitem que você substitua a propriedade ou adicione uma nova propriedade à classe pai existente. Sintaticamente o mesmo para as categorias, elas não têm nome e são representadas como @interface class () Nenhum arquivo .m está presente e o método declarado na extensão deve ser implementado na implementação do arquivo principal
Mais ajuda neste link
fonte
Aqui está o meu entendimento:
As extensões são geralmente usadas para adicionar recursos extras à nossa própria " classe personalizada ". Podemos adicionar métodos ou propriedades privadas que estendem a interface da classe, que podem ser usados na implementação da classe.
As extensões devem ser gravadas no mesmo arquivo da classe. Portanto, você não pode escrever extensões para tipos predefinidos como String, Float, etc.
Por outro lado, as categorias podem ser usadas para adicionar métodos extras a classes pré-existentes. Por exemplo, podemos criar nossos próprios métodos estendendo a classe String. Observe que não podemos criar propriedades extras nas categorias. Outra vantagem principal das categorias é que podemos escrever as categorias em qualquer outro arquivo, fora do arquivo onde sua classe sai.
Além disso, ao criar categorias, você deve dar um nome para elas entre colchetes. Mas para extensão, nenhum nome é necessário. Por isso, algumas vezes também são chamadas de categorias anônimas.
fonte