Eu gostaria de saber por que o padrão de design de categorias Objective-C foi projetado de uma maneira que não podemos adicionar variáveis de instância.
E também vim a saber que usando objetos associados a Objective-C conseguimos fazer. Mas estou mais interessado em saber qual é a principal razão por trás disso.
Respostas:
0 para resposta № 1Responda editado para falar sobre variáveis de instância em vez de propriedades.
Adicionando variáveis de instância a um objeto mudaa alocação de memória do objeto e exige que o objeto seja recompilado. As categorias adicionam novos métodos aos objetos existentes sem exigir uma recompilação e, portanto, não podem adicionar variáveis de instância.
Como você diz, você pode adicionar propriedades onde os dados são salvos e carregados usando o armazenamento associativo.
EDITAR:
Se você tem uma classe FooClass com um cabeçalho como este:
//FooClass.h
@interface FooClass : NSObject
@property (nonatomic, strong) NSString *bar1;
@end
Isso define uma classe com uma propriedade bar1
e apoiado por uma variável de instância _bar1
.
Uma categoria externa de FooClass
não foi possível adicionar variáveis de instância extra FooClass
.
No entanto, você pode criar uma "categoria privada"o arquivo .m para FooClass que pode definir propriedades adicionais (com variáveis de instância de apoio) para a classe. Isso funciona porque essas variáveis de instância adicionais são conhecidas em tempo de compilação e podem ser "incorporadas" à classe. Aqui está um exemplo:
// FooClass.m
@interface FooClass()
@property (nonatomic, strong) NSString*bar2;
@end
@implementation FooClass
@end
Observe a declaração extra @interface, com uma propriedade adicional. Como está no mesmo arquivo .m da implementação, ele não está exposto a outros arquivos, mas é conhecido em tempo de compilação, para que o compilador possa adicionar a (s) variável (s) de instância necessária (s).