Xcode 7.3 non può creare __ riferimento debole nel file utilizzando il conteggio manuale dei riferimenti


86

Dopo l'aggiornamento a Xcode 7.3, genera l'errore Cannot create __weak reference in file using manual reference countingnei file pod. Qualcuno ha risolto questo problema?

Risposte:


176

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

Esempio visivo

Tratto da forum degli sviluppatori Apple - Xcode 7.3b4, non-arc, non può creare __ riferimento debole .


7
Questo ancora non funziona per me :( potrebbe esserci un altro flag del compilatore che sovrascrive questa impostazione che potrei aver abilitato? Ho questi -Wall -Wextra -Wno-unused-parameterflag di avviso abilitati.
Kdawgwilk

6
@Kdawgwilk Sei sicuro di aver attivato correttamente quel flag? Se è nel tuo progetto puoi semplicemente eliminare __weak parola chiave tho. Non ho provato, ma puoi anche provare ad attivare la bandiera nel progetto Pod se stai usando Pod
REALFREE

3
Nota se attualmente esegui l'installazione del pod / l'aggiornamento del pod, i riferimenti deboli nel rilascio con conservazione manuale sono impostati su NO per ogni destinazione del pod e dovrai modificare nuovamente le impostazioni di build.
Damo

2
Ho dovuto farlo anche nell'impostazione del progetto pod.
Bernard

risposta fantastica ragazzi.
Bartłomiej Semańczyk

21

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 __weakin modalità non ARC da ora per evitare conflitti imprevisti. Per gli utenti di cocoapods, non è necessario eliminare __weako attendere l'aggiornamento, ma impostare il Weak References in Manual Retain Releaseflag nelle impostazioni di build su SÌ come ha detto Lean. Spero che questo aiuto.


1
Nota se attualmente esegui l'installazione del pod / l'aggiornamento del pod, i riferimenti deboli nel rilascio con conservazione manuale sono impostati su NO per ogni destinazione del pod e dovrai modificare nuovamente le impostazioni di build.
Damo

20

Il modo migliore per risolvere questo problema è aggiungere uno post_installscript al tuo Podfile che imposti il Weak References in Manual Retain Releaseflag su yestutti 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

Grande idea! Funziona per me, perché sto usando Cocoapods. Grazie.
mginius

3
Ho ricevuto il seguente errore: -fobjc-weak non è supportato sull'attuale target di distribuzione
g212gs

Ho ricevuto anche l'errore -fobjc-weak, ma sono riuscito a risolverlo impostando l'obiettivo di distribuzione di tutti i pod su 8.3 (il mio obiettivo di distribuzione del progetto). Puoi farlo con uno script, come suggerito nel secondo script sopra.
Xys

8

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. XHTML valido.


1
Solo una nota: sembra che FB abbia cambiato la linea incriminata nella v3.24.4, per la linea di rilascio 3.x. (Non sono sicuro della serie 4.x, ma non sembra che sia lì ora.)
big_m

7

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:

  1. Un riferimento senza proprietario (ovvero che non rappresenta un conteggio di conservazione).

  2. 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.)


1

Vai alla tua destinazione nella scheda "Build Phases" cerca i file pod in "Compile Sources", fai clic su quei file e aggiungi il flag del compilatore "-fobjc-arc"


0

Oppure cambia __weakin __unsafeunretained. Questo risolverà il problema nella tradizione. Poiché MRC (prima di xCode 4 -) __weak non era in iOS.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.