19 Nov, 2013 17:34

Utilizando ARC em seus aplicativos iOS

Quando usamos o ARC, não precisamos mais usar os métodos retain, release e autorelease. Esses métodos são responsáveis por incrementar e decrementar o contador de referências de um objeto - quando esse contador chega a zero a memória do objeto é liberada. Já no ARC, o compilador insere esses comandos automaticamente no código em tempo de compilação (isso o difere do Garbage Collector do Java, que é feito em tempo de execução).

Strong e Weak

Por padrão todas as variáveis criadas são strong. Pela regra do ARC, os objetos continuarão na memória enquanto houver pelo menos uma variável strong apontando para eles, seja uma variável local, de instância ou uma propriedade. Por exemplo, quando eu crio uma String:

NSString *nome1 = @"Rafael";

Eu crio um ponteiro strong para o objeto @"Rafael". Se eu criar outra variável apontando para o mesmo lugar:

NSString *nome2 = nome1;

Existirão dois ponteiros strong para a mesma variável, nesse caso mesmo se eu apontar a variável nome1 para outro objeto:

nome1 = @"João";

O objeto @"Rafael" continuará na memória, pois ainda existe uma variável (nome2) apontando para ele. Contudo, quando o nome2 também apontar para outro objeto ou acabar seu escopo, o objeto @"Rafael" sairá da memória.

As variáveis Weak são diferentes, elas não incrementam o contador de referências do objeto. Se fizermos o mesmo código com a variável nome2 weak:

NSString *nome1 = @"Rafael";

__weak NSString *nome2 = nome1;

nome1 = @"João";

O objeto @"Rafael" será desalocado da memória e a variável nome2 ficará nula. Na gerência manual de memória, as variáveis não ficavam nulas, elas apontavam para posições de memória liberada, por vezes outro objeto acabava entrando naquela memória e erros estranhos ocorriam.

As variáveis weak são pouco utilizadas, elas são úteis especialmente para objetos que mantém referências cíclicas (um aponta para o outro). Como é o caso de delegates, por exemplo. Se ambas as variáveis forem* strong*, os objetos jamais serão desalocados, pois sempre existirá um ponteiro para cada um.

Propriedades

Propriedades também podem ser strong ou weak, para declará-las use a sintaxe abaixo:

@property (nonatomic, strong) NSString *nome;
@property (nonatomic, weak) id <MeuDelegate> delegate;

Considerações

O ARC é muito simples, mas ainda possui limitações. Se o seu aplicativo usa a API Core Foundation ou malloc() e free(), você ainda precisará usar a gerência manual de memória. Outra questão é que as vezes é preciso setar suas variáveis para nulo para que os objetos não fiquem presos na memória para sempre.

Em um post futuro irei explicar como usar códigos com ARC e com gerência manual de memória no mesmo projeto. Isso ocorrerá muito quando você tem um projeto que ainda não é ARC e quer usar Libs externas que são ARC ou vice e versa.

Ao navegar neste site, você consente o uso de cookies nossos e de terceiros, que coletam informações anônimas e são essenciais para melhorar sua experiência em nosso site.