O Xcode 7.3 não pode criar __ referência fraca no arquivo usando a contagem manual de referência


86

Depois de atualizar para o Xcode 7.3, ele lança o erro Cannot create __weak reference in file using manual reference countingnos arquivos pod. Alguém resolveu esse problema?

Respostas:


176

Defina Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Releasecomo YES.

Exemplo visual

Retirado dos Fóruns de Desenvolvedores da Apple - Xcode 7.3b4, não arc, não pode criar referência __weak .


7
Isso ainda não funciona para mim :( poderia haver outro sinalizador do compilador que substitui esta configuração que eu possa ter habilitado? Eu tenho esses -Wall -Wextra -Wno-unused-parametersinalizadores de Aviso habilitados.
Kdawgwilk

6
@Kdawgwilk Tem certeza de ativar esse sinalizador corretamente? Se estiver em seu projeto, você pode simplesmente excluir __weak palavra-chave tho. Não tentei, mas você também pode tentar ativar o sinalizador no projeto Pod se estiver usando o Pod
REALFREE

3
Observe que, se você atualmente executa pod install / pod update, Weak References in Manual Retain Release é definido como NO para cada pod target - e você terá que editar as configurações de compilação novamente.
Damo

2
Eu tive que fazer isso na configuração do projeto de pod também.
Bernard

resposta incrível pessoal.
Bartłomiej Semańczyk

21

Esta é a resposta oficial da Apple no link:

Este problema se comporta conforme pretendido com base no seguinte: Estamos no processo de implementação de referências fracas em todos os modos de linguagem Objective-C. Uma vez que “__weak” tem sido historicamente ignorado em modos de linguagem não ARC (e não GC), adicionamos este erro para apontar lugares onde a semântica mudará no futuro. Atualize seu relatório de bug para nos informar se isso ainda é um problema para você.

Então, basicamente, se você estiver usando o Pod para bibliotecas de terceiros, você deve excluir __weak em não-ARC ou aguardar a atualização.

Atualizar @ 23/03

Eu deveria ter pesquisado mais sobre sinalizadores que posso passar para o complier para contornar esses tipos de coisas. Mas, fundamentalmente, você não deve usar __weakno modo não ARC a partir de agora para evitar conflitos inesperados. Para usuários de cocoapods, você não precisa deletar __weakou esperar pela atualização, mas definir o Weak References in Manual Retain Releasesinalizador nas configurações de compilação para SIM, como disse o Lean. Espero esta ajuda.


1
Observe que, se você atualmente executa pod install / pod update, Weak References in Manual Retain Release é definido como NO para cada pod target - e você terá que editar as configurações de compilação novamente.
Damo

20

A melhor maneira de resolver isso é adicionar um post_installscript ao seu Podfile que define o Weak References in Manual Retain Releasesinalizador yesem todos os destinos do seu pod. Para fazer isso, basta colar o código a seguir na parte inferior do seu Podfile.

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
        end
    end
end

Às vezes, fazer isso resulta em erro -fobjc-weak is not supported on the current deployment target. Você pode resolver isso adicionando outra opção de configuração, forçando todos os pods a direcionar a versão desejada (com base nesta resposta ):

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
            config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.3'
        end
    end
end

Boa ideia! Está funcionando para mim, porque estou usando Cocoapods. Obrigado.
mginius

3
Recebi o seguinte erro: -fobjc-weak não é compatível com o destino de implantação atual
g212gs

Também recebi o erro -fobjc-weak, mas consegui corrigi-lo definindo todos os destinos de implantação de pods para 8.3 (meu destino de implantação de projeto). Você pode fazer isso com um script, como sugerido no segundo script acima.
Xys

8

Solução alternativa para referências fracas do Facebook em FBSettings.m

Para o Podfile, é possível escrever um script para ser executado após a instalação / atualização do pod, descreve o seguinte lá.

 
post_install do | installer |
     classy_pods_target = installer.pods_project.targets.find {| target | target.name == 'Facebook-iOS-SDK'}
     classy_pods_target.build_configurations.each do | config |
         config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
     end
 end

CLANG_ENABLE_OBJC_WEAK como encontrar as palavras da magia que. XHTML válido.


1
Apenas uma observação: parece que o FB alterou a linha ofensiva na v3.24.4, para a linha de lançamento 3.x. (Não tenho certeza sobre a série 4.x, mas parece que não está lá agora.)
big_m

7

Eu encontrei isso.

Eu acho que significa deletar __weak

https://forums.developer.apple.com/thread/38934

Erm, já houve algo como uma referência de variável fraca no MRR [retenção-liberação manual]? "__weak" significa uma ou ambas as coisas:

  1. Uma referência sem proprietário (ou seja, não representa uma contagem de retenção).

  2. Uma referência de zeragem (isto é, o tempo de execução zera quando o objeto referenciado é desalocado).

# 1 não se aplica ao MRR, porque você simplesmente não retém a variável de qualquer maneira.

# 2 também não se aplica ao MRR, porque o suporte de tempo de execução está em GC e ARC [contagem automática de referência], que você não está usando.

Parece que o compilador agora está apenas reclamando que não pode fazer o que nunca faria. (E no caso de um delegado de aplicativo, você não seria capaz de perceber a diferença em tempo de execução, já que o delegado de aplicativo geralmente nunca é desalocado.)


1

Basta ir para o seu destino na guia "Build Phases", procurar os arquivos pod em "Compile Sources", clicar nesses arquivos e adicionar o sinalizador do compilador "-fobjc-arc"


0

Ou mude __weakpara __unsafeunretained. Isso resolverá o problema da tradição. Desde MRC (antes de xCode 4 -) __weak não estava em iOS.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.