Depois de atualizar para o Xcode 7.3, ele lança o erro Cannot create __weak reference in file using manual reference counting
nos arquivos pod. Alguém resolveu esse problema?
Respostas:
Defina Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release
como YES
.
Retirado dos Fóruns de Desenvolvedores da Apple - Xcode 7.3b4, não arc, não pode criar referência __weak .
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 __weak
no modo não ARC a partir de agora para evitar conflitos inesperados. Para usuários de cocoapods, você não precisa deletar __weak
ou esperar pela atualização, mas definir o Weak References in Manual Retain Release
sinalizador nas configurações de compilação para SIM, como disse o Lean. Espero esta ajuda.
A melhor maneira de resolver isso é adicionar um post_install
script ao seu Podfile que define o Weak References in Manual Retain Release
sinalizador yes
em 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
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. .
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:
Uma referência sem proprietário (ou seja, não representa uma contagem de retenção).
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.)
Ou mude __weak
para __unsafeunretained
. Isso resolverá o problema da tradição. Desde MRC (antes de xCode 4 -) __weak não estava em iOS.
-Wall -Wextra -Wno-unused-parameter
sinalizadores de Aviso habilitados.