Algumas perguntas sobre a contagem automática de referências no iOS5 SDK

134

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 entendi que nunca mais precisaremos liberar e reter objetos. Minhas perguntas são:

  1. Se eu decidir atualizar para o iOS 5, preciso remover todas as instruções [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: precisarei verificar a versão do iOS e chamar reter e liberar de acordo? Então, basicamente, o ARC está disponível para todas as versões do iOS ou apenas para o iOS 5?

Luke47
fonte

Respostas:

150

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

Sim, mas o XCode 4.2 inclui uma nova ferramenta "Migrar para Objective-C ARC" (no menu Editar-> Refatorar), que faz isso por você. Chamar dealloc é uma história diferente. Conforme mencionado nos comentários, a referência de clang afirma que você deve manter seu método desalocado:

Justificativa: mesmo que o ARC destrua as variáveis ​​de instância automaticamente, ainda existem razões legítimas para escrever um método desalocado, como liberar recursos não retidos. Deixar de chamar [super dealloc] nesse método é quase sempre um bug.

Você ativa o ARC usando um novo sinalizador de compilador -fobjc-arc. O ARC é suportado no Xcode 4.2 para Mac OS X v10.6 e v10.7 (aplicativos de 64 bits) e no 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 para 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: precisarei verificar a versão do iOS e chamar reter e liberar de acordo? 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 compilação e não no tempo de execução.

Em vez de você precisar se lembrar de quando usar reter, liberar e liberar automaticamente, o ARC avalia os requisitos de vida útil de seus objetos e insere automaticamente as chamadas de método apropriadas para você no momento da compilação. O compilador também gera métodos de desalocação apropriados para você.

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

Henrik P. Hessel
fonte
Obrigado pela sua explicação!
Luke47
4
Isso não está 100% correto. Há uma opção de compilador que determina se o ARC está ativado ou não. Além disso, acredito que o ARC precisa de suporte em tempo de execução, portanto, se você deseja que seu aplicativo funcione no iOS 4.x, você deve deixar em suas retenções e liberações e garantir que o ARC esteja desativado.
JeremyP
8
@ JeremyP - O iOS 4.0 é realmente suportado como um alvo para aplicativos ARC, portanto, não há necessidade de manter o código contado de referência manual para abordar essa plataforma mais antiga. Talvez o iPhone OS 3.x, mas imagino que a Apple descontinue o suporte a isso como plataforma de destino quando o 5.0 for lançado, como fizeram no 2.x quando o 4.0 foi lançado.
Brad Larson
5
@ Brad A base de instalação do iOS4 já é superior a 95%. Eu acho que é salvo descartar o suporte para iOS3 de qualquer maneira.
Henrik P. Hessel
2
Você não remove dealloc, apenas remove todos os seus releasee [super dealloc]dele. E em 99,9% deallocapenas libera objetos, então você o remove. Mas os objetos ainda precisam executar outras tarefas de limpeza que não são release(fechar arquivos, remover observadores etc.).
Stanislav Yaglo
8

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

Se você deseja desativar o ARC em vários arquivos:

  1. Selecione os arquivos desejados em Destino / Fases de compilação / Fontes de compilação no Xcode
  2. PRESSIONE ENTER . (clique duas vezes seleciona apenas um arquivo)
  3. Digite -fno-objc-arc
  4. Pressione Enter ou Concluído

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

Tibidabo
fonte
7

Tanto quanto eu entendo e tanto quanto meu iPhone / iPod com iOS 5 e iOS 4.3, respectivamente, funciona, é tudo bastante automático. Um aplicativo que eu iniciei para a 4.0 e "atualizei" para funcionar com o Xcode para iOS 5.0 nunca lança nenhum tipo de aviso sobre liberação e retenção, mesmo que esteja presente em todos os acordos, etc. No entanto, alguns dos mesmos códigos inseridos (copiou o arquivo) em um novo projeto criado com o Xcode para iOS 5, com muitos avisos. Parece que você não precisa remover todas essas chamadas e não, de alguma forma, a adapta automaticamente para versões mais antigas. Ao criar um perfil no meu iPod, não vejo vazamentos de memória ou outros sinais de falha nos acordos / liberações. Isso ajuda?

Dylan Gattey
fonte
A versão beta mais recente realmente me pede para remover todas as chamadas de alocação, e é isso. Você ainda pode reter / liberar, mas o sistema tem a última palavra.
Dylan Gattey
5

Em relação a 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: precisarei verificar a versão do iOS e chamar reter e liberar de acordo? Então, basicamente, o ARC está disponível para todas as versões do iOS ou apenas para o iOS 5?

Deve-se observar que o compilador do iOS 5 utiliza a "retro-compatibilidade" (na verdade, ADICIONA o código para fazer com que a retenção / liberação funcione, essencialmente), mas se você não estiver compilando para o iOS 5.0, não poderá usar weakcomo palavra-chave . Em vez disso você usa assign. Isso é lamentável: weaké uma enorme vantagem (nunca há indicadores pendentes!). Veja a minha pergunta aqui para uma discussão sobre weak, assigne ARC.

Dan Rosenstark
fonte
2

Se você pode desabilitar o ARC não usando o novo sinalizador de compilador -fobjc-arc, não é obrigado a reescrever o código avançando - eu acho (?)

oliver
fonte