Pergunta

Entendo que podemos usar referências associativas para invocar comportamento semelhante ao ivar em categorias.Mas qual é a razão específica por trás de não ser possível declarar novos ivars em categorias?

Será porque invadiríamos o espaço privado da aula?Ou há algum outro motivo?Se sim, eu apreciaria um exemplo que mostrasse a capacidade de declarar ivars em categorias quebrando tudo o que quebra.

Foi útil?

Solução

Pense nos ivars do Objective-C como uma estrutura C simples e antiga.Quando você instancia uma instância de uma classe, é criado um bloco de memória grande o suficiente para conter essa estrutura.

Digamos que você tenha um NSString.Muitos e muitos códigos existentes são compilados para uso NSString.Muito desse código está integrado em bibliotecas e estruturas.Esse código compilado foi criado sabendo que os ivars de NSString pegue um número X de bytes e esteja em alguns deslocamentos específicos dentro dessa memória.

Agora, em seu pequeno projeto, digamos que você crie uma categoria em NSString e deseja adicionar um ivar.Em teoria, qualquer código em seu projeto que inclua o arquivo de cabeçalho da categoria saberia que o tamanho desse "novo" NSString (mais categoria) ocupa bytes X + Y.Isso é muito parecido com uma subclasse.Este código recém-compilado poderia lidar adequadamente com os ivar(s) adicionais.

Mas todo o código pré-compilado, as bibliotecas e os frameworks, não teriam conhecimento dos ivars adicionais.Quando NSString instâncias são criadas lá, a memória tem apenas X bytes, não X + Y bytes.O caos se instala quando o código do seu aplicativo obtém uma referência a esse pedaço menor de memória e tenta acessar os bytes da categoria ivar.As coisas iriam explodir.

Com uma subclasse simples e antiga, as coisas funcionam porque qualquer código que possa usar os ivars da subclasse conhece os ivars da subclasse.Mas com uma categoria, o código pré-existente não tem conhecimento das adições e não criará adequadamente o espaço para elas.

Suponho que devo especificar que tudo o que foi dito acima é em grande parte uma suposição fundamentada.Eu poderia estar totalmente errado.Parece razoável, pelo menos.:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top