/ / Objective-C categorias não permite adicionar variáveis ​​de instância [duplicado] - objetivo-c, propriedades, categorias, ivar

As categorias Objective-C não permitem adicionar variáveis ​​de instância [duplicado] - objetivo-c, propriedades, categorias, ivar

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 № 1

Responda 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).