Pergunta

Entendo que no Objective-C devo declarar variáveis ​​de instância como parte da interface da minha classe, mesmo que essas variáveis ​​sejam detalhes de implementação e tenham acesso privado.

Em C "subjetivo", posso declarar uma variável em meu arquivo .c e ela não é visível fora dessa unidade de compilação.Posso declará-lo no arquivo .h correspondente, e então qualquer pessoa que fizer um link nessa unidade de compilação poderá ver a variável.

Gostaria de saber se existe uma escolha equivalente em Objective-C ou se devo realmente declarar cada ivar no .h para minha classe.

Ari.

Foi útil?

Solução

Ari,

Uma boa referência sobre como realizar declarações de variáveis ​​de instância "invisíveis" pode ser encontrado aqui com crédito respeitosamente dado a Matt Gallagher.

Espero que ajude, Frank

Outras dicas

As variáveis ​​de instância têm sido tradicionalmente necessárias para determinar o tamanho da classe.Sempre foi uma má prática acessar diretamente os ivars, e esse não é o ponto.No tempo de execução moderno, isso é menos necessário, mas de qualquer forma, não é um vazamento de abstração, a menos que os clientes dependam dos ivars da classe, o que deveria ser impossível, já que você os está declarando como @protected ou @private, certo?

Para restringir o acesso, você pode usar o @private ou @protected palavras-chave:

@interface Foo : NSObject {
    @private
    int barPrivate;

    @protected
    int barProtected;

    @public
    int barPublic;
}
@end

EDITAR: Raspe tudo, acontece que eu realmente preciso dormir um pouco.

ivars são @protected por padrão (embora @private e @protected não garanta que outras classes não possam acessá-los - você sempre pode acessar ivars com getValue:forKey:).Você nunca deve acessar diretamente os ivars de outras classes em qualquer caso - a "escolha" é expor ou não os ivars como propriedades (você apenas precisa confiar em todas as classes que seguem a convenção para não acessar os ivars diretamente).

No novo tempo de execução do objetivo-c, você não precisa declarar ivars, pois eles podem ser sintetizados em tempo de execução, mas infelizmente isso não funciona com o simulador do iPhone, então, por enquanto, é melhor apenas declarar todos os ivars no arquivo .h.

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