Dopo l'aggiornamento a Xcode 7.3, genera l'errore Cannot create __weak reference in file using manual reference counting
nei file pod. Qualcuno ha risolto questo problema?
Risposte:
Imposta Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release
su YES
.
Tratto da forum degli sviluppatori Apple - Xcode 7.3b4, non-arc, non può creare __ riferimento debole .
Questa è la risposta ufficiale di Apple dal link:
Questo problema si comporta come previsto in base a quanto segue: Stiamo implementando riferimenti deboli in tutte le modalità del linguaggio Objective-C. Poiché "__weak" è stato storicamente ignorato nelle modalità di linguaggio non ARC (e non GC), abbiamo aggiunto questo errore per indicare i punti in cui la semantica cambierà in futuro. Aggiorna la tua segnalazione di bug per farci sapere se questo è ancora un problema per te.
Quindi, in pratica, se stai usando Pod per librerie di terze parti, devi eliminare __weak in non-ARC o attendere l'aggiornamento.
Aggiorna @ 3/23
Avrei dovuto cercare di più sui flag che posso passare al compilatore per aggirare queste cose. Ma fondamentalmente non dovresti usare __weak
in modalità non ARC da ora per evitare conflitti imprevisti. Per gli utenti di cocoapods, non è necessario eliminare __weak
o attendere l'aggiornamento, ma impostare il Weak References in Manual Retain Release
flag nelle impostazioni di build su SÌ come ha detto Lean. Spero che questo aiuto.
Il modo migliore per risolvere questo problema è aggiungere uno post_install
script al tuo Podfile che imposti il Weak References in Manual Retain Release
flag su yes
tutti i tuoi obiettivi pod. Per farlo basta incollare il codice seguente nella parte inferiore del file 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
A volte, facendo quel risultato nell'errore -fobjc-weak is not supported on the current deployment target
. Puoi risolverlo aggiungendo un'altra opzione di configurazione, costringendo tutti i pod a scegliere come target la versione che desideri (in base a questa risposta ):
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
Soluzione alternativa per i riferimenti deboli di Facebook in FBSettings.m
In Podfile, è possibile scrivere uno script da eseguire dopo l'installazione / aggiornamento del pod, che descrive quanto segue.
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 come trovare le parole della magia che. .
L'ho trovato.
Immagino che significhi eliminare __weak
https://forums.developer.apple.com/thread/38934
Ehm, esisteva mai qualcosa come un riferimento di variabile debole sotto MRR [rilascio-ritenzione manuale]? "__weak" significa una o entrambe le due cose:
Un riferimento senza proprietario (ovvero che non rappresenta un conteggio di conservazione).
Un riferimento di azzeramento (ovvero che il runtime si azzera quando l'oggetto referenziato viene deallocato).
# 1 non si applica a MRR, perché semplicemente non mantieni comunque la variabile.
# 2 non si applica nemmeno a MRR, perché il supporto runtime è in GC e ARC [conteggio automatico dei riferimenti], che non stai utilizzando.
Sembra che il compilatore ora si stia solo lamentando di non poter fare ciò che non potrebbe mai fare. (E nel caso di un delegato dell'app, non saresti in grado di rilevare la differenza in fase di esecuzione, poiché il delegato dell'app generalmente non viene mai deallocato.)
Oppure cambia __weak
in __unsafeunretained
. Questo risolverà il problema nella tradizione. Poiché MRC (prima di xCode 4 -) __weak non era in iOS.
-Wall -Wextra -Wno-unused-parameter
flag di avviso abilitati.