Algumas dúvidas sobre a contagem automática de referência no SDK do iOS5

Atualmente estou desenvolvendo um aplicativo para iPad. O desenvolvimento começou para o iOS 4.2 e agora continua (e acho que será concluído) para o iOS 4.3. Acabei de ler sobre o ARC no iOS 5 e, basicamente, eu entendi que nunca mais precisaremos liberar e reter objects. Minhas perguntas são:

  1. Se eu decidir atualizar para o iOS 5, preciso remover todas as [myObject retain] e [myObject release] do meu código?

  2. Se eu desenvolver um novo aplicativo para iOS 5 usando o ARC, precisarei implementar algum tipo de verificação de “retro-compatibilidade”? ou seja: será necessário verificar a versão do iOS e chamar reter e liberar adequadamente? Então, basicamente, o ARC está disponível para todas as versões do iOS ou apenas para o iOS 5?

Se eu decidir atualizar para o iOS 5, preciso remover todas as instruções [myObject keep] e [myObject release] do meu código?

Sim, mas o XCode 4.2 inclui uma nova ferramenta “Migrate to Objective-C ARC” (no menu Edit-> Refactor), que faz isso para você. Calling dealloc é uma história diferente. Como mencionado nos comentários, a referência clang indica que você deve manter seu método dealloc:

Justificativa: mesmo que o ARC destrua variables ​​de instância automaticamente, ainda existem razões legítimas para escrever um método de dealloc, como liberar resources não-retidos. Deixar de chamar [super dealloc] em tal método é quase sempre um bug.

Você habilita o ARC usando um novo sinalizador de compilador de arcobob-arc. O ARC é suportado no Xcode 4.2 para Mac OS X v10.6 e v10.7 (aplicativos de 64 bits) e para iOS 4 e iOS 5. (Referências fracas não são suportadas no Mac OS X v10.6 e iOS 4). Não há suporte a ARC no Xcode 4.1.

Se eu desenvolver um novo aplicativo para iOS 5 usando o ARC, precisarei implementar algum tipo de verificação de “retro-compatibilidade”? Ou seja: será necessário verificar a versão do iOS e chamar reter e liberar adequadamente? Então, basicamente, o ARC está disponível para todas as versões do iOS ou apenas para o iOS 5?

Não, porque o ARC faz sua mágica no tempo de compilation e não no tempo de execução.

Em vez de você precisar se lembrar de quando usar reter, liberar e autorelease, o ARC avalia os requisitos de tempo de vida de seus objects e insere automaticamente as chamadas de método apropriadas para você em tempo de compilation. O compilador também gera methods dealloc apropriados para você.

Mais informações sobre o ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html

Q1: NÃO, Se você tem um código existente, você pode continuar usando-o como está com o -fno-objc-arc, você pode seletivamente desabilitar o ARC em qualquer arquivo.

Se você quiser desabilitar o ARC em arquivos MULTIPLE :

  1. Selecione os arquivos desejados no Target / Build Phases / Compile Sources no Xcode
  2. PRESSIONE ENTER . (clique duplo seleciona apenas um arquivo)
  3. Digite -fno-objc-arc
  4. Pressione Enter ou Concluído

Q2: NÃO, o destino pode ser tão baixo quanto o iOS 4.0

Tanto quanto eu entendo e tanto quanto o meu iPhone / iPod rodando iOS 5 e iOS 4.3 respectivamente funcionam, é tudo bastante automático. Um aplicativo que eu iniciei para o 4.0 e “atualizei” para trabalhar com o Xcode para iOS 5.0 nunca lança qualquer tipo de aviso sobre liberar e reter, mesmo que esteja em todos os dealloc, etc. No entanto, alguns dos mesmos códigos inseridos (copiou o arquivo) em um novo projeto criado com o Xcode para iOS 5 tem muitos, muitos avisos. Então parece que você não precisa remover todas essas chamadas, e não, de alguma forma ele se adapta automaticamente para versões mais antigas. Criando perfis no meu iPod, não vejo vazamentos de memory ou outros sinais de falha em desalocações / liberações. Isso ajuda?

Sobre esta parte da sua pergunta

Se eu desenvolver um novo aplicativo para iOS 5 usando o ARC, precisarei implementar algum tipo de verificação de “retro-compatibilidade”? Ou seja: será necessário verificar a versão do iOS e chamar reter e liberar adequadamente? Então, basicamente, o ARC está disponível para todas as versões do iOS ou apenas para o iOS 5?

Deve-se notar que o compilador iOS 5 leva da “retro-compatibilidade” (na verdade, ADDS o código para fazer reter / liberar trabalho, essencialmente), mas se você não está compilando para o iOS 5.0, você não pode usar weak como um palavra chave. Em vez disso você usa assign . Isso é lamentável: weak é uma enorme vantagem (sem pointers pendentes, nunca!). Veja a minha pergunta aqui para uma discussão de weak , assign e ARC.

Se você pode desabilitar o ARC não usando o novo sinalizador do compilador -fobjc-arc, então você não é forçado a rewrite código avançando – eu acho (?)