Devo declarar minhas variáveis de instância no header ou na implementação?

Variáveis de instância são aquelas declaradas entre chaves dentro escopo @interface. A linguagem permite que sejam declaradas no header (.h) ou na implementação (.m), contanto que dentro do escopo de chaves da @interface. Entretanto, qual seria a melhor forma de se declarar?

@interface Classe : NSObject {
    int quantidade;
}
@end

Exemplo de variável de instância declarada no header (.h)

#import "Classe.h"

@interface Classe() {
    int quantidade2;
}
@end

@implementation Classe
//implementação da classe
@end

Exemplo de variável de instância declarada na implementação (.m)


Ao ver em códigos a declaração de variáveis de instância no header(.h) é possível imaginar que esta é a forma correta. Acontece que somente por volta de 2012 que foi possível declarar essas variáveis na implementação(.m). Por isso que ainda é visto no header – antes disso não tinha opção.

Apesar de serem declaradas no header (que tem acesso público), todas as variáveis de instância tem o nível de acesso @protected por padrão. Isso significa que somente a @implementation e as classes que herdam dela terão acesso à essa variável.

Em contra partida, as variáveis de instância declaradas na implementação só são acessíveis pela própria classe. Por estarem na implementação, todas elas são acessíveis somente pela própria classe. Mesmo o uso de modificadores de visibilidade (@public, @protected e @private) são ignorados pelo compilador, nem geram erros.

Então é melhor usar no header mesmo?

Não. As variáveis de instância só devem ser acessíveis pela implementação. Com o avanço da linguagem Objective-C,  a prática de declarar variáveis no header foi deixada de lado, especialmente pois o acesso à elas por outras classes pode dar erro. Para tratar variáveis que serão herdadas por outras classes foram criadas as propertys. Que nada mais são do que variáveis com getter e setter. Ao recuperar/alterar o valor de uma property de outra classe, na verdade está sendo chamado o getter/setter da variável.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s