Vinícius Oliveira

I love coding.

iOS : Automatic Counting Reference - ARC

Introdução

A grande mudança no iOS 5 foi o novo recurso adicionado chamado de contador automático de referência (ARC - Automatic Counting Reference).ARC é uma característica do novo compilador LLVM 3.0 que acaba completamente com o gerenciamento de memória manual.Usar o ARC em seus projetos é extremamente simples.Você mantém o mesmo código, como de costume, exceto que você não precisa realizar chamadas a release , retain ou ao autorelease.O ARC realiza todas essas tarefas pra você :).
Com o ARC habilitado , o compilador irá inserir automaticamente retain,release e autorelease nos lugares corretos em seu programa.

Como o ARC funciona?

Você provavelmente já está familiarizado com o gerenciamento de memória manual, que funciona basicamente assim:

  • Se você precisa manter um objeto , você deve retê-lo (retain), a menos que já foi retido para você.
  • Se você quiser parar de usar um objeto , você precisa para liberá-lo (release), a menos que já foi liberado para você ( com o autorelease).

Acho que para todos no começo , essa tarefa de entender o gerenciamento de memória manual é algo difícil,mas com o tempo se torna natural manter o balanceamento dos retains e releases .Exceto quando você esquece de realizar essa tarefa rs
Os princípios de gerenciamento de memória manual não são difíceis, mas é muito fácil cometer um erro. E esses pequenos erros podem ter consequências terríveis. O seu aplicativo irá falhar em algum ponto, porque você lançou um objeto muitas vezes e suas variáveis ​​estão apontando para dados que já não é válido, ou você vai ficar sem memória, porque se você não liberar os objetos acontecem os famosos leaks.
O Static Analyzer do Xcode é uma grande ajuda para encontrar esses problemas , mas o ARC vai um passo além.O ARC evita problemas de gerenciamento de memória completamente ,inserindo o retain e o release pra você.
É importante perceber que a ARC é uma característica do compilador do Objective-C e, portanto, todo o trabalho do ARC é feito na compilação do seu programa. O ARC não é uma característica de tempo de execução (com exceção de uma pequena parte, o sistema de weak pointer), nem é um garbage collector.

Ponteiros mantém os objetos em memória

As novas regras que você tem que aprender para o ARC são bastante simples. Com o gerenciamento de memória manual você precisava dar um retain no objeto para mantê-lo em memória. Isso já não é necessário, tudo que você precisa é fazer um ponteiro para o objeto.
Enquanto há uma variável que aponta para um objeto, esse objeto permanece na memória. Quando o ponteiro chega um novo valor ou deixa de existir, o objeto associado é liberado (release). Isto é válido para todas as variáveis​​:variáveis ​​de instância, propriedades, e até mesmo,variáveis ​​locais.
Veja o seguinte exemplo :

1
     NSString * firstName = self.textField.text;

A variável firstName é um ponteiro para o objeto string “Ray” que guarda o valor do campo de texto.Essa variável agora também é proprietário do objeto string “Ray”.

Um objeto pode ter mais de um dono. Até que o usuário não mude o conteúdo do UITextField,a propriedade self.textField.text também é um proprietário do objeto string “Ray”. Existem dois ponteiros para manter esse objeto em memória :
Momentos depois, o usuário vai digitar algo novo no campo de texto e sua propriedade de texto agora aponta para um novo objeto string. Mas o objeto string original ainda tem um proprietário (a variável firstName) e, portanto, permanece na memória.

Somente quando firstName recebe um novo valor também, ou sai do escopo - porque é uma variável local e o método termina, ou porque é uma variável de instância e o objeto a que ela pertence é desalocado .O objeto string não tem mais proprietários, o seu retain count é 0 e ele é desalocado.

Chamamos ponteiros como firstName e textField.text de strong porque mantém os objetos vivos (em memória). Por padrão, todas as variáveis ​​de instância e variáveis ​​locais são ponteiros strong.
Há também um ponteiro chamado de weak. Variáveis ​​que são weak ainda pode apontar para objetos, mas eles não se tornam proprietários.
Veja o seguinte exemplo :

1
__weak NSString * weakName = self.textField.text;

A variável weakName aponta para o mesmo objeto string “Rayman” que a propriedade self.textField.text aponta , mas ela não é proprietária do objeto.
Se o campo de texto alterar o conteúdo, então o objeto string “Rayman” não tem mais donos e é desalocado.

Quando isso acontece, o valor de weakName torna-se automaticamente nulo.Note que este é extremamente conveniente, pois impede ponteiros weak de apontar para a memória liberada.
Você provavelmente não vai usar muito os ponteiros weaks. Eles são principalmente úteis quando dois objetos têm uma relação parent-child. O parent vai ter um ponteiro strong para seu child - e, portanto, é o “dono” - mas, a fim de evitar ciclos de propriedade, o child só tem um ponteiro weak de volta para seu parent.
Um exemplo disto é o padrão delegate. Seu UIControllerView pode possuir um UITableView através de um ponteiro strong. Já o data source e o delegate apontam para o UIControllerView mas são weaks ponteiros.

Veja o seguinte exemplo :

1
2
__weak NSString *str = [[NSString alloc] initWithFormat:...];
NSLog(@"%@", str);  // a saída será "(null)"

Não existe um dono para o objeto string (porque str é fraco) e o objeto será desalocado imediatamente após ele ser criado. O Xcode vai dar o seguinte aviso quando você faz isso ,porque provavelmente não é o que você quer fazer.

1
(Warning: assigning retained object to weak variable; object will be released after assignment).

Você pode usar a palavra-chave __strong para falar que uma variável é um ponteiro strong:

1
__strong NSString *firstName = self.textField.text;

As variáveis ​​são strong por default e o __strong pode ser omitido. Propriedades também podem ser strong e weak. A notação para propriedades é:

1
2
@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, weak) id <MyDelegate> delegate;

O ARC vai remover um monte de lixo do seu código. Você não tem que pensar sobre quando usar o release ou quando usar o retain, apenas sobre como os objetos se relacionam entre si.

Traduzido de : http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1.