Devo usar ivars em objective-C?
-
14-11-2019 - |
Pergunta
Eu tenho uma aplicação que estou a escrever, que usa exclusivamente @propriedades.Eu não tenho uma ivar declarado em tudo em qualquer um dos meus arquivos de classe.Como eu a entendo ivars não são mais necessários, com a introdução da @propriedade.Sou eu de codificação de acordo com as melhores práticas?Isso vai acabar mordendo-me na proverbial bunda no longo prazo?Eu tenho lido análises sobre o que é "certo" e "errado"...
Solução
Eu geralmente não declarar ivars, qualquer um. Eu, muitas vezes, uso E eu sempre permitir que o compilador automaticamente sintetizar o ivar com o @synthesize foo = foo_;
embora para impedir o acesso direto quando eu quis dizer através de método ou vice-versa._
prefixo (que evita o acesso direto, como por atingiu frase).
E, como o Caleb disse, ainda há ivars a flutuar, você simplesmente não declarar explicitamente 'em, a menos que você realmente quer (o que, realmente, não como exposto ivars nos cabeçalhos não são úteis para os clientes da classe, se a sua API é projetada de forma adequada).
Eu também acho que o hype sobre "apenas usar o acesso direto em init/dealloc, use setter/getter em qualquer outro lugar" para ser, em grande parte exageradas e, assim, basta usar o setter/getter em todos os lugares.A realidade é que se você tiver observadores durante a inicialização/desalocação, você já está lavado;o estado do objeto é, por definição, não definido durante a construção/destruição e, portanto, um observador não pode, possivelmente, a razão corretamente sobre o estado.
Como Calebe, aponta outra razão para usar o direct ivar acesso em init/dealloc é evitar subclasses implementam personalizado setter/getter lógica que pode barf devido ao estado indefinido do objeto durante o init/dealloc.
Enquanto isso pode ser verdade, considero-a uma terrível falha de arquitectura para implementar setters/getters com o comportamento personalizado.Isso é frágil e torna significativamente mais difícil para refatorar o código ao longo do tempo.Assim, tal comportamento personalizado, muitas vezes, têm de dependência em outro estado dentro do objeto e que a dependência leva, então, a ordem de dependências nas alterações de estado que não são refletidas pela aparente simples @property
declaração.
I. e.se o seu setters e getters são escritos de tal forma que foo.bar = bad;
não pode ser executado em qualquer tempo foo
, e , em seguida, seu código é preso.
Outras dicas
Não é tanto que as variáveis de instância não são necessárias.É apenas uma variável de instância declarações não são necessárias.Dada uma propriedade e uma instrução @synthesize, o compilador cuidará de criar a variável de instância, juntamente com os métodos de acesso apropriados.
Não há nada de errado em usar propriedades exclusivamente.Eles simplificam o gerenciamento de memória.Também não há nada de errado em usar IVARs sem propriedades, se é isso que você quer.Se você quiser usar propriedades, mas não quer anunciar os acessadores para o resto do mundo (ou seja, manter encapsulamento), considere declarar suas propriedades não públicas em uma extensão de classe (basicamente uma categoria anônima em seu arquivo de implementação). .
Usando IVARs Certamente não está errado, por mais que as melhores práticas agora façam pressionadas para usar @Property.
Um lugar onde você pode querer usar um IVAR é quando você deseja declarar uma propriedade protegida.Você declara a propriedade no arquivo .m para uma aula e declara seu ivar correspondente no .h com a diretiva @protected.Isso permitirá que você tenha um acesso protegido na subclasse.Não há alternativa para acesso protegido aos membros.