Compreendendo os tipos de referência (Reference Types)
Para podermos entender de fato como usar o Garbage Collector (visto anteriormente) nas nossas aplicações, precisamos ainda entender dois conceitos fundamentais que diz respeito em como o garbage collector irá funcionar. Estes conceitos são referências fortes e fracas. Todos os ponteiros de objeto em Objective-C são referências, isso significa que eles se referem a memória alocada para um objeto. Uma referência pode ser forte ou fraca. Por padrão, todas as referências em Objective-C são referências fortes. Esta, é um tipo de referência que o garbage collector seguirá para determinar que um objeto está "vivo" e não poderá ser recolhido. Referências fracas, por outro lado, são referências de objetos a serem recolhidos, se estes não possuÃrem referências fortes.
Este conceito é útil quando tivermos uma referência a um objeto, e esse objeto está marcado para ser desalocado, e não podemos rete-lo. Por exemplo, o NSNotification Center usa referências fracas para quem está registrado nele. Vale a pena ressaltar que em um ambiente de referência, os objetos que estão registrados com o NSNotification Center devem remover-se como observadores em seus métodos dealloc. Em um ambiente de garbage collector, este requisito não é necessário porque quando o objeto é desalocado, a referência fraca para esse objeto no NSNotification Center se torna inválida, definida pra zero. Portanto, o NSNotification Center não faz mais envios de notificações para esse objeto.
Lembre-se que em um ambiente de reference counted, quando um objeto tem um delegate, ele usa o atributo de propriedade assign para criar uma referência fraca para o delegate. A razão para este feito é reter ciclos. Vejamos um exemplo de como definir uma referência.
Definindo uma referência fraca
@interface Foo : NSObject
  __weak NSString *memberVariable;
Além de especificar manualmente uma referência como sendo fraca, há também a possibilidade de usar classes especializadas para armazenar listas de referências fracas. Podemos usar essas classes, tais como NSArray ou NSDictionary em casos onde queremos armazenar referências fracas, ao invés de fortes.
As classes especiais são: NSMapTable, NSHashTable e NSPointerArray. Quando usamos essas classes e temos um elemento desse array desalocado, a referência a esse elemento é simplesmente removida do array. Normalmente, se utilizamos um NSArray ou similar, a referência forte do array mantém os objetos ativos.
Configurando o seu projeto para o Garbage Collector
Configurar o projeto para o Garbage Collector é relativamente simples. Tudo o que precisamos fazer é configurar o build settings, e alterar a configuração para Objective-C Garbage Collector. Se você procurar por essa configuração, irá encontrar uma lista de possÃveis valores. Esta incluem o seguinte:
Unsupported: Usa o retain count para gerenciamento de memória.
Supported: Especifica que o projeto suporta o Garbage Collector, mas não o exige.
Required: O Garbage Collector é necessário para esta aplicação e todos os frameworks que ele usa.
A primeira opção é sem suporte. A segunda opção é a de suporte. Esta, adiciona o sinalizador -fobjc-gc, que especifica que o projeto suporta o garbage collector, mas não exige isso.
Ao usar essa configuração, podemos lincar o nosso projeto com aplicações que não tenham sido compiladas com garbage collector. Esta configuração é normalmente usada apenas para as bibliotecas. Nesta configuração, se espera que o código implemente ambos os métodos, dealloc e finalize, independente do fato da aplicação ser compilada com garbage collector ou não.
Na configuração final, é necessário que o compilador acrescente -fobjc-gc somente para as configurações de compilação, e especifica não usa retain/release. Portanto, não pode ser carregado em uma aplicação que não faz uso do garbage collector.
Se você estiver convertendo uma aplicação existente a partir de um ambiente que não faz uso de garbage collector para um ambiente que o utilize, você deve saber que todos os métodos especÃficos para o modelo que não faz uso de garbage collector deixarão de ser funcionais. O inicializador ainda vai ser chamado, mas o seu método dealloc, não. Você deve então refatorar o método dealloc, ou remover os recursos de desalocação que você pode ter tido antes, em um método finalize.