Entendendo a diferença entre os arquivos .h e .m

Para entender a existência dos dois arquivos, temos que saber que Objective-C é uma linguagem feita tendo por base a linguagem C. Objective-C abrange todas as funções de C e as suas próprias, tanto que é possível compilar qualquer código C em um compilador Objective-C. Para quem já usou C verá que os arquivos .h e .m tem o mesmo sentido dos arquivos .h e .c da linguagem C. Esses dois arquivos formam uma classe.

O arquivo .h

Esse arquivo é o cabeçalho da sua classe, mais conhecido como interface. A indicação @interface pode ser vista no começo de todo arquivo desse tipo e é finalizada com @end. Esse arquivo por padrão tem o mesmo nome do arquivo .m.

Apesar de ser chamado de interface, esse tipo de arquivo tem um sentido diferente de interface de outras linguagens de programação (como Java). Para melhor entendimento, esse arquivo é um cabeçalho (em inglês, header). Não há nenhum código para ser executado aqui, somente imports, declarações de métodos, properties e delegates. Tudo que é declarado aqui pode ser acessado pelas classes que importarem esse header. Em java, seria como colocar as variáveis desse arquivo com o indicador public.

No código abaixo, qualquer outra classe que importe o arquivo NomeDaClasse.h terá acesso à propertyPublica e poderá executar os métodos metodoPublicoDeClasse, metodoPublicoDeInstancia.

@interface NomeDaClasse : NomeDaClassePai

@property (strong, nonatomic) NSString *propertyPublica;
+ (void)metodoPublicoDeClasse;
- (void)metodoPublicoDeInstancia;

@end

O arquivo .m

Esse arquivo é a implementação da sua classe. Nele está o código que será executado. Além dessa diferença, toda variável, property ou método declarado no arquivo .m é privada, não é acessível por outras classes.

Esse arquivo sempre possui um @implementation indicando o início da implementação de métodos e finaliza com @end. Lembrando que todo método declarado na interface (.h) deve ser implementado entre o @implementation e @end juntamente com os métodos privados. Para realizar a conexão entre os métodos públicos declarados na interface, é necessário sempre importar o arquivo de interface (#import NomeDaClasse.h).

Para se declarar variáveis e métodos privados, é declarado uma nova interface dentro deste arquivo de implementação (.m). Essa declaração fica entre os imports e a declaração @implementation. A declaração da interface privada difere um pouco da pública, pois não indica a classe pai, no lugar existe um par de parêntesis (como na linha marcada abaixo). A declaração de métodos privados na interface privada é recomendado, porém não é obrigatório, como é o caso do metodoPrivadoNaoDeclarado visto no código de exemplo abaixo.

No código abaixo, a variavelPrivadaDeInstancia,  a propertyPrivada e os metodos metodoPrivadoDeclaradoNaInterfacePrivada, metodoPrivadoNaoDeclarado são completamente inacessíveis por qualquer classe que faça o import do header. Isso significa que qualquer classe não pode alterar essas variáveis/propertys nem mesmo executar esses métodos diretamente. Para deixar claro, esses métodos e variáveis podem ser alterados pelos métodos e propertys públicas declaradas no header (como ocorre no metodoPublicoDeInstancia).

#import "NomeDaClasse.h"
@interface NomeDaClasse () {
    NSString *variavelPrivadaDeInstancia;
}

@property (strong, nonatomic) NSString *propertyPrivada;
-(void)metodoPrivadoDeclaradoNaInterfacePrivada;
@end

@implementation NomeDaClasse
@synthesize propertyPublica;
@synthesize propertyPrivada;

+ (void) metodoPublicoDeClasse {
}

- (void) metodoPublicoDeInstancia {
    variavelPrivadaDeInstancia = [[NSString alloc] initWithString: @"Variavel privada sendo alterada por um metodo publico"];
}

-(void) metodoPrivadoDeclaradoNaInterfacePrivada {
}

-(void) metodoPrivadoNãoDeclarado {
}
@end

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