Desabilitar a contagem automática de referência para alguns arquivos

183

Fiz o download do iOS 5 SDK e descobri que o ARC é um ótimo recurso do novo compilador da Apple. Por enquanto, muitas estruturas de terceiros não suportam o ARC. Posso usar o ARC para o meu novo código e manter o atual código de retenção / liberação inalterado? O conversor ARC não funciona aqui, porque algumas estruturas, como JSONKit, não podem ser convertidas em ARC usando o conversor.

Editar:

A resposta é adicionar -fno-objc-arcaos sinalizadores do compilador os arquivos que você não deseja que o ARC. No Xcode 4, você pode fazer isso sob o seu objetivo -> Construir fases -> Compilar fontes.

não elástico
fonte
2
Para esclarecer, basta adicioná-lo ao .marquivo. Não é o .harquivo.
Ma11hew28
Eu encontrei esta conversa: github.com/gowalla/AFNetworking/issues/36 Talvez ajude alguém a integrar o JSONKit em um projeto suportado por iOS5 ARC ;-) Mas eu não tentei no momento ...
Este método funcionou para mim. Eu estava adicionando o AsyncUdpSocket para UDP Multicast ao meu projeto e esses arquivos [pelo menos a versão atual] NÃO estão suportando o ARC. Portanto, usei o método acima para adicionar o sinalizador do compilador ao arquivo AsyncUdpSocket.m e posso fazer com que o código funcione bem com meu aplicativo.
Ashu Joshi
2
Isso funciona perfeitamente! Detalhes: Vá para o seu destino e escolha Build Fhases, depois Compile Sources. Se você clicar duas vezes no arquivo .m em questão, vai aparecer uma caixa onde você pode digitar / colar: "-fno-objc-arc"
mpemburn

Respostas:

73

Os documentos públicos do ARC , embora não estejam diretamente claros neste ponto, parecem sugerir que, desde que cada classe seja toda o ARC ou todos gerenciados manualmente, as classes podem ser integradas em um único programa.

Você não pode misturar apenas ARC e não-ARC em uma única classe; o documento diz que o envio retain, release, autorelease, ou retainCountmensagens por qualquer meio (incluindo temporizadores e executa atrasadas, que uso @selector) é proibido no código de ARC. Portanto, você não pode fazer não-ARC em uma classe ARC (porque as mensagens necessárias são proibidas) e você não pode fazer ARC em uma classe não-ARC (porque o ARC adiciona elementos de sintaxe inválidos sem o ARC).

O mesmo documento é um pouco mais claro se você pode integrar bibliotecas / estruturas que não sejam do ARC em um programa do ARC: Sim. Ele não menciona se você pode usar as bibliotecas / estruturas do ARC em um programa em que todo o seu código é não-ARC, mas, considerando todas as opções acima, a implicação parece ser sim.

Peter Hosey
fonte
Obrigado! Eu descobri como desativar o ARC para classes não-ARC existentes.
nonamelive
Você poderia compartilhar conosco o que está fazendo?
David H
1
@ David H: Se você pretender dirigir isso ao questionador, observe que o questionador editou sua solução na pergunta.
Peter Hosey 29/07
A compilação do ARC não pode ser desativada nos arquivos HEADER. Clang NÃO irá compilar a interface / cabeçalho com base na compilação de seu arquivo de implementação / método. Portanto, os arquivos de cabeçalho devem ser compatíveis com o ARC e não-ARC em uma compilação mista. Eu vejo isso como um bug no compilador.
carmin
1
@ carmin: Não é. O compilador não examina os arquivos de cabeçalho, exceto quando você solicita, o que normalmente você faz somente #importusando arquivos de módulo. A configuração dos sinalizadores do compilador é para cada arquivo de módulo (mais precisamente, cada arquivo na fase de compilação "Fontes de compilação"). O compilador não tem como saber se deve usar o ARC ou não para qualquer outro arquivo, exceto herdando a opção que foi dada para o arquivo de módulo iniciado.
precisa saber é o seguinte
78

Não é muito intuitivo como desabilitar o ARC em vários arquivos, por um tempo eu o fiz um por um até descobrir como fazer isso.

  1. Selecione os arquivos desejados em Destino / Fases de construção / Fontes de compilação no Xcode (CMD + clique ou Shift + clique)
  2. PRESSIONE ENTER (clique duas vezes redefinirá a seleção, para que não funcione)
  3. Digite -fno-objc-arc
  4. Pressione Enter ou Concluído
Tibidabo
fonte
1
Não é realmente uma resposta para a pergunta feita aqui, mas uma boa dica! Votado +1
Kristof Van Landschoot 25/04/12
Você está certo, não é, mas eu sempre pesquisei no switch e essa resposta foi uma das principais. Pensei nos dias de hoje a maioria das pessoas já sabe a resposta, mas não esta "ponta"
Tibidabo
35

Se você deseja desativar a Contagem automática de referência para alguns arquivos, é muito simples seguir as etapas. Você adiciona sinalizadores de compilador em Destinos -> Fases de construção -> Fontes de compilação.

xcode

A bandeira usada é -fno-objc-arc, pressione enter depois de escrevê-la.! Você deve clicar duas vezes na coluna direita da linha em Sinalizadores do compilador. Espero que ajude Obrigado :)

Nikhil Bansal
fonte
14
Você pode usar o mesmo método para permitir a ARC em um arquivo específico em um projeto não-ARC usando o sinalizador -fobjc-arc.
precisa saber é o seguinte
A compilação do ARC não pode ser desativada nos arquivos HEADER. Clang NÃO irá compilar a interface / cabeçalho com base na compilação de seu arquivo de implementação / método. Portanto, os arquivos de cabeçalho devem ser compatíveis com o ARC e não-ARC em uma compilação mista. Eu vejo isso como um bug no compilador.
carmin