terça-feira, 27 de novembro de 2012

ARC - Automatic Reference Counting

Olá a todos!!!

Este será meu último post a respeito da linguagem Objective-C e as peculiaridades do desenvolvimento  geral para plataformas IOS e Mac OS X. Alias, a partir de agora, focarei somente nas especificações referentes à plataforma IOS que é o foco deste blog. Então vamos lá!!!

Não poderia começar a falar do ambiente de desenvolvimento IOS sem dizer nada sobre a mais nova forma de gerenciar memória automaticamente: o Automatic Reference Counting (ARC).

O IOS 5 trouxe uma forma mais prática de se trabalhar com a memória. Isso porque o novo compilador consegue detectar com grande precisão os potenciais problemas de memória que existem no programa. Este compilador (LLVM 3.0) está disponível a partir do Xcode 4.2.

Na prática, assim como nas aplicações usando Garbage Collector, não precisamos mais chamar os métodos release, autorelease e retain (estes métodos se tornam inclusive depreciados na SDK 5). Além disso, a partir do Mac OS X 10.8 (Mountain Lion), o ARC se tornou também o modelo padrão de desenvolvimento das aplicações para Mac.

Outros recursos que deixaram de ser usados foram: NSZone, retainCount, [super dealloc], @selector(retain), @selector(release).

Com relação ao dealloc, devemos passar a nos preocupar apenas com a anulação dos ponteiros. A desalocação de memória passa a ser função do ARC. Também usando ARC, qualquer variável ponteiro é inicializada automaticamente com nil.

Apesar das inúmeras vantagens, tornou-se mais difícil sincronizar os códigos em Objective-C com C/C++.

Para códigos legados, o Xcode 4 auxilia o processo de conversão do projeto para a SDK 5 (em edit > refactor > "Convert to Obj-C ARC").

Da mesma forma que no Garbage Collector, algumas classes podem não funcionar com o ARC, cabendo a nós fazermos o gerenciamento manual. Nesse caso, devemos sinalizar o compilador para não usar ARC nos devidos arquivos. Em Propriedades(clique no projeto) > Build Phases > Compile Sources > (duplo clique na classe) insira a tag -fno-obj-arc.

Para usar ARC, basta criar um projeto com essa opção marcada (desde que seu Xcode suporte a funcionalidade). Já para desabilitar totalmente, basta procurar nas propriedades do projeto no LLVM Compiler X.X - LANGUAGE a opção "Automatic Reference Counting" e mudar de yes para no.

Para mais informações a respeito do ARC, leia este artigo oficial. Outro artigo interessante que recomendo é este daqui.

USANDO PROPRIEDADES COM O ARC:

@property(weak) MyClass *myObj;

NSString __weak *string;

A forma como trabalhamos com propriedades também mudou com os novos atributos strong e weak. O strong tem a mesma função que o retain e é definido por padrão às variáveis e propriedades, já o weak é bem semelhante ao assign com a diferença de que, quando o objeto é desalocado, a propriedade é definida para nil (nulo em Objective-C).

Utilizar o weak é essencial para evitarmos que os objetos que não estão sendo mais usados continuem sendo apontados por um strong pointer.

No caso das variáveis, os Lifetime Qualifiers, como são chamados estes atributos, possuem pequenas diferenças e alguns novos tipos:

  • __strong: É o default. O objeto permanecerá vivo enquanto houver sendo apontado por um strong pointer.
  • __weak: Significa que o ponteiro em questão não mantém o objeto vivo (o mesmo é setado para nil quando o objeto for desalocado).
  • __unsafe_unretained: Especifica que este ponteiro não manterá o objeto vivo (como em strong) e nem será setado para nil quando o mesmo deixar de existir (como em weak).
  • __autoreleasing: Com este lifetime qualifier, o objeto liberará a memória utilizada para armazenar um objeto passado como parâmetro para um método assim que ele é retornado. Em resumo, garante que dentro da execução do método o objeto vai estar disponível, mas só durante esse período.
Para mais informações a respeito dos Lifetime Qualifiers, recomendo este artigo.

Isso é tudo. Espero que tenha sido de boa utilidade, e não deixem de comentar!

Até a próxima...

Nenhum comentário:

Postar um comentário

Obrigado por deixar a sua participação!