Prática recomendada do iOS 5 (liberar / manter?)

109

Como um programador de iPhone iniciante, qual é a prática recomendada para escrever aplicativos a serem usados ​​com iOS 5 ou versões anteriores? Especificamente, devo continuar usando a liberação / retenção de dados ou devo ignorar isso? Isso importa?

Geekgirl
fonte
1
Use o ARC e siga as práticas recomendadas descritas aqui: amattn.com/2011/12/07/arc_best_practices.html Se você fizer isso, verá que o ARC "simplesmente funciona". Se você não seguir essas práticas, acabará com vazamentos e gastará muito tempo rastreando-os ....
n13

Respostas:

98

Você decide. Você pode escrever aplicativos usando ARC (contagem automática de referência), e o Xcode irá escrever um "código de colagem" para permitir que seus aplicativos habilitados para ARC sejam executados no iOS 4, sem necessidade de modificações. No entanto, certas coisas não funcionarão e, mais notavelmente, muitas bibliotecas que você deseja usar irão (às vezes) gerar inúmeros erros e você não poderá usá-los até que os desenvolvedores liberem uma atualização compatível com ARC.


Edit : Eu descobri recentemente que você pode desligar o ARC em uma base por arquivo. Veja a resposta do pixelfreak . Portanto, meu conselho continua válido, mas agora as bibliotecas de terceiros não precisam ser atualizadas para funcionar com o ARC.

Aqui está o que a Apple diz sobre a desativação do ARC para arquivos específicos:

Quando você migra um projeto para usar o ARC, o sinalizador do compilador -fobjc-arc é definido como o padrão para todos os arquivos de origem Objective-C. Você pode desabilitar o ARC para uma classe específica usando o sinalizador do compilador -fno-objc-arc para essa classe. No Xcode, na guia Build Phases de destino, abra o grupo Compile Sources para revelar a lista de arquivos de origem. Clique duas vezes no arquivo para o qual deseja definir o sinalizador, insira -fno-objc-arc no painel pop-up e clique em Concluído.

insira a descrição da imagem aqui

Veja o guia de transição completo aqui .

sudo rm -rf
fonte
15
O ARC pode, evidentemente, ser desligado "por arquivo", talvez permitindo o uso de bibliotecas legadas ... Mas eu não brinquei com ele, então não sei ainda. Estou muito animado com isso. Você pode imaginar um mundo onde os desenvolvedores de iOS não precisem se preocupar em reter / liberar? O que vamos conversar aqui no SO ?? ;-)
Dan Ray de
45
Bem quando eu finalmente consegui controlar toda aquela porcaria de gerenciamento de memória, eles o tornaram irrelevante. EMPREGOS!!!
Kongress de
@Dan: Você não está brincando que pode ser desligado seletivamente? Por favor, dê um link, que é importante para mim! : D
sudo rm -rf
1
Eu acredito que o compilador não está sob o NDA agora, então para excluir seletivamente alguns arquivos (normalmente pastas de origem de terceiros) do seu código, basta adicionar esta opção como compilador para cada arquivo: -fno-objc-arc
blackjack75
2
@Yar: Sim, você é. Eu gostaria que fosse tão simples, mas infelizmente nem todas as bibliotecas são tão simples. Veja JSONKit, por exemplo. Tente fazer isso por meio da verificação ARC. Você verá o que quero dizer. ;)
sudo rm -rf
170

Para quem ainda está curioso sobre como desligar o ARC em arquivos individuais, aqui está o que eu fiz:

  1. Vá para as configurações do seu projeto, em Build Phases > Compile Sources
  2. Selecione os arquivos que deseja desabilitar o ARC e adicione os sinalizadores de compilador -fno-objc-arc . Você pode definir sinalizadores para vários arquivos de uma só vez, selecionando os arquivos e pressionando a tecla "Enter".

Não sei se essa é a forma recomendada, mas funciona para mim.

PS: Reuni essas informações em clang.llvm.org aqui, que estão acessíveis ao público, portanto, não estão sob o NDA.

pixelfreak
fonte
1
Quando eu uso esse sinalizador com uma biblioteca, ele funciona, mas assim que incluo o arquivo lib .h em uma classe ARC, o Xcode reclama como se eu não tivesse o sinalizador lá. Você conseguiu fazer com que bibliotecas antigas funcionassem com este sinalizador?
casey
Consigo fazer o ASIHttpRequest e o SBJson funcionar (recebo 1 aviso sobre o uso de struct em Reachability.h). Coloquei a bandeira em todos os seus arquivos de implementação.
pixelfreak
Todos os arquivos de implementação ou apenas os .h's? Na minha seção Compile Sources do projeto, ele contém apenas os arquivos de cabeçalho, nenhum arquivo de implementação. Posso adicioná-los, mas não parece ter um efeito diferente. Para sua referência, estou tentando fazer um analisador REST funcionar. ( github.com/mirek/NSMutableDictionary-REST.framework )
casey
1
Aha! Não examinei de perto os erros. Eles são erros diferentes daqueles sem a bandeira. Eu só tive que remover o pool de liberação automática do código e ei-la!
casey
Quando eu seleciono vários arquivos e pressiono Enter, como foi sugerido aqui, todos eles foram removidos das 'fontes de compilação' nas fases de construção. Eu tive que selecioná-los individualmente. Não tenho certeza se estou fazendo algo errado.
Gopalakrishnan Subramanian
10

O iOS 5 ainda está sob um NDA e provavelmente estará até o lançamento da versão pública. Se você tiver uma conta de desenvolvedor, vá até os Fóruns de Desenvolvedores da Apple e pergunte lá.

Para versões anteriores, você deve contar as referências e retê-las e liberá-las de acordo. Confira o guia de gerenciamento de memória .

Edit: Aqui está uma especificação pública para contagem automática de referência e uma citação da página pública do iOS 5 :

A contagem automática de referência (ARC) para Objective-C torna o gerenciamento de memória o trabalho do compilador. Ao habilitar o ARC com o novo compilador LLVM da Apple, você nunca precisará digitar reter ou liberar novamente, simplificando drasticamente o processo de desenvolvimento, enquanto reduz travamentos e vazamentos de memória. O compilador tem um entendimento completo de seus objetos e libera cada objeto no instante em que ele não é mais usado, para que os aplicativos sejam executados mais rápido do que nunca, com desempenho previsível e suave.

Nevan King
fonte
Os aplicativos desenvolvidos com iOS 5 funcionarão com iPhones mais antigos?
Geekgirl
Você poderá usar as ferramentas para desenvolver sistemas operacionais mais antigos, mas não será capaz de usar as novas tecnologias como ARC. Se quiser ter como alvo sistemas operacionais mais antigos, você terá que fazer o gerenciamento manual de memória. Se você quiser usar o ARC, terá que restringir os usuários ao iOS 5.
nevan king
1
Uma referência ao ARC está em uma página pública da Apple em developer.apple.com/technologies/ios5, portanto, pelo menos algumas partes dela não estão sob NDA.
cobbal
8
Na verdade, isso não é bem verdade. Você pode construir para iOS 4 com ARC. Citação do engenheiro da Apple: " Para iOS 4 e Mac OS 10.6, o compilador adiciona um pouco de código de colagem de compatibilidade de tempo de execução ao seu aplicativo. Isso funciona para tudo, exceto __variáveis ​​fracas, que exigem mais suporte do que o código de compatibilidade pode fornecer. ARC no iOS 4 é mais simples do que o código não ARC, mas não é tão simples quanto o ARC no iOS 5. "A propósito, o aplicativo de programação WWDC foi escrito com ARC e funcionou perfeitamente no iOS 4!
sudo rm -rf
3
Sim; no entanto, isso foi qualificado na palestra do ARC, já que apenas os alvos 4.3.x obtêm a 'cola de compatibilidade'.
Alan Zeino,
4

Os detalhes são leves / sob NDA no momento, mas a Apple implementou contagem automática de referência (ARC) no iOS 5, conforme detalhado aqui: http://developer.apple.com/technologies/ios5/

Se você desenvolver um novo aplicativo no Xcode 4 com o iOS 5 SDK, poderá ignorar com segurança a contagem de retenções / liberações.

[editar] sudo rm -rf apresenta um bom argumento; libs de terceiros podem ser significativamente afetados

Dominic
fonte
Os aplicativos desenvolvidos com iOS 5 funcionarão com iPhones mais antigos?
Geekgirl de
Funcionará em iPhones com iOS 5, então apenas iPhone 3GS ou iPhone 4. Não acredito que suporte iOS 4, mas é feito pelo LLVM durante a compilação, então pode ser possível produzir um binário para iOS 4 e 5. Eu recomendo fortemente obter uma conta de desenvolvedor iOS e brincar com as opções disponíveis.
Dominic
Como sudo aponta em seu comentário sobre a resposta de Nevan, você pode, de fato, voltar ao iOS 4.0 com ARC, então os dispositivos mais antigos que podem executar esse sistema operacional são compatíveis com isso.
Brad Larson
3

Ninguém mencionou SystemConfiguration.framework ? Não se esqueça de colocá-lo no Frameworks . Eu miseravelmente passei várias horas para perceber isso.

ThinkChris
fonte
você deve explicar o porquê.
John Riselvato
3

Certamente é escolha do desenvolvedor ou da equipe. O ARC (contador automático de referência) tornou as coisas um pouco mais fáceis, gerenciando automaticamente a memória para você. Ele irá liberar, reter e desalocar quando apropriado. Eu acredito que você deve ganhar experiência no gerenciamento de memória por conta própria, de preferência em um aplicativo de teste, se ainda não o fez. Outra coisa a considerar é se seu aplicativo depende de bibliotecas de terceiros, que, se não convertidas para ARC, impedirão que seu aplicativo seja compilado. A escolha depende obviamente da situação em questão.

Charles
fonte
0

definir sinalizador como -fno-objc-arc em configurações do projeto> Fases de construção> Fontes de compilação

Mubin Shaikh
fonte