terça-feira, 27 de novembro de 2012

Visão geral do Objective-C

Olá caro leitor!

No post anterior, vimos como funcionam os principais conceitos relacionados ao gerenciamento de memória manual no Objective-C. Felizmente tudo o que é mais difícil de ser entendido sobre esse assunto já foi comentado.

Vamos agora estudar alguns exemplos básicos em Objective-C, para, mais tarde entendermos os últimos tópicos de gerenciamento de memória. Estes exemplos são uma continuidade de algumas aulas ministradas por Vitor Carreira, do Instituto Politécnico de Leiria, em Portugal.

Os programas a seguir foram compilados usando o Xcode 4.5.2 e Objective-C 2.0, portanto, usando o compilador que suporta @autoreleasepool. Caso você esteja programando em um Mac OS X Snow Leopard ou inferior (que ao menos suporte Objective-C 2.0), trate de remover esses blocos e substituir pelo clássico NSAutoReleasePool.

O primeiro exemplo trata da utilização básica de classes em Objective-C.

Observe que os objetos são instanciados chamando-se alloc seguido de init:

Fraction *f1 = [[Fraction alloc] init];

Assim, a chamada de métodos em Objective-C ocorre por meio de COLCHETES. Observe também que alloc e init são métodos da classe, pois estão sendo chamados através de Fraction. Dessa forma, existem diferenças na implementação de variáveis e métodos de instância e de classe.

[f2 setNumerator:3 andDenominator:4];

Nesse caso acima, estamos chamando um método da instância f2. Observe a assinatura do método:

- (void)setNumerator:(int)n andDenominator:(int)d;

O sinal (-) avisa ao compilador que o método pertence à instância. Em seguida, temos o tipo de retorno (void), e os nomes das mensagens com os respectivos parâmetros a serem recebidos. Observe que, diferentemente do C++, aqui declaramos dois nomes para cada parâmetro a ser recebido.



Acima podemos visualizar toda a declaração do header file. Primeiro, definimos as variáveis de instância da classe dentro do bloco. Em seguida, definimos propriedades para essas variáveis (semelhantes às do C#), as quais criarão métodos get e set automáticos.

Toda a declaração do .h acontece dentro de uma @interface e @end. Da mesma forma, toda a declaração do .m acontece dentre @implementation e @end.

Observe que a classe em questão é filha de NSObject. Muitos métodos são gerados automaticamente para nós através dessa classe. Podemos sobrescrevê-los, como é o caso do init no .m

Para gerar os getters e setters no .m, devemos chamar @synthesize:

@synthesize numerator;
@synthesize denominator;

O exemplo ainda conta com uma classe denominada de MyClass que demonstra como criamos métodos de classe (com sinal de +), variáveis de classe públicas e privadas, e variáveis de instância publicas, privadas e protegidas.




O segundo exemplo é uma continuação do primeiro, mas demonstra como criarmos Convenience Constructors. É importante ressaltar que o init com mais número de parâmetros sempre deverá ser o Designated Initializer, ou seja, o método responsável pela iniciação da classe pai:




Observe que os método description implementado no .m não possui assinatura no .h. Isso significa que este é um método que esta sendo sobrecarregado da classe pai. O compilador assim irá executar as operações polimórficas para descobrir qual foi a implementação mais próxima da última classe da hierarquia e irá executá-la. Caso não encontre, dispara uma exceção.



Observe que no método multiply, chamamos o método alloc. Então somos responsáveis por remover o conteúdo da memória. Como isso não é viável no momento, chamamos o autorelease. Assim, a referência será desalocada junto com a @autoreleasepool.

No terceiro exemplo, demonstro como utilizar a NSMutableDictionary e NSDate da rica Framework Foundation, além de dar exemplos sobre como criar métodos privados e protocolos (o mesmo que interfaces em java e C#). É importante ressaltar que não existe uma maneira de declarar métodos protected em Objective-C

Além disso, mostro como funciona o uso de foreach em Objective-C, e maneiras de melhor gerenciar a memória usando propriedades, apresentando também um novo método da NSObject chamado de dealloc. Este método equivale aos destrutores do C++. Aqui, devemos chamar o release de tudo que criamos no escopo da instância. É importante ressaltar que, pela documentação, o método dealloc JAMAIS deve ser chamado no código, sendo uma tarefa do compilador chamá-lo no momento mais adequado.

Bem, por hora é só. Para mais informações a respeito dos conteúdos abordados aqui, consulte esse resumão oficial da Apple sobre a linguagem.

Até a próxima!

Nenhum comentário:

Postar um comentário

Obrigado por deixar a sua participação!