Xcode 7.3 ne peut pas créer une référence __weak dans le fichier en utilisant le comptage manuel des références

86

Après la mise à jour vers Xcode 7.3, l'erreur Cannot create __weak reference in file using manual reference countingdans les fichiers pod. Quelqu'un a-t-il résolu ce problème?

REALFREE
la source

Réponses:

176

Réglez Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Releasesur YES.

Exemple visuel

Tiré des forums des développeurs Apple - Xcode 7.3b4, non-arc, ne peut pas créer de référence __weak .

Ryan
la source
7
Cela ne fonctionne toujours pas pour moi: (pourrait-il y avoir un autre indicateur de compilateur qui remplace ce paramètre que j'aurais peut-être activé? J'ai ces -Wall -Wextra -Wno-unused-parameterindicateurs d'avertissement activés.
Kdawgwilk
6
@Kdawgwilk Vous êtes sûr d'activer correctement cet indicateur? Si c'est dans votre projet, vous pouvez simplement supprimer le mot-clé __weak tho. Je n'ai pas essayé, mais vous pouvez également essayer d'activer le drapeau dans le projet Pod si vous utilisez Pod
REALFREE
3
Notez que si vous exécutez actuellement l'installation du pod / la mise à jour du pod, les références faibles dans la version de conservation manuelle sont définies sur NON pour chaque cible de pod - et vous devrez à nouveau modifier les paramètres de construction.
Damo
2
Je devais également le faire dans le cadre d'un projet de pod.
Bernard
les gars de réponse géniaux.
Bartłomiej Semańczyk
21

Voici la réponse officielle d'Apple à partir du lien:

Ce problème se comporte comme prévu sur la base de ce qui suit: Nous sommes en train d'implémenter des références faibles dans tous les modes de langage Objective-C. Puisque «__weak» a historiquement été ignoré dans les modes de langage non-ARC (et non-GC), nous avons ajouté cette erreur pour signaler les endroits où la sémantique changera à l'avenir. Veuillez mettre à jour votre rapport de bogue pour nous indiquer si le problème persiste.

Donc, fondamentalement, si vous utilisez Pod pour des bibliothèques tierces, vous devez soit supprimer __weak dans non-ARC, soit attendre la mise à jour.

Mettre à jour le 23/03

J'aurais dû faire plus de recherches sur les drapeaux que je peux transmettre à complier afin de contourner ce genre de choses. Mais fondamentalement, vous ne devriez pas utiliser __weaken mode non-ARC à partir de maintenant pour éviter tout conflit inattendu. Pour les utilisateurs de cocoapods, vous n'avez pas besoin de supprimer __weakou d'attendre la mise à jour, mais définissez l' Weak References in Manual Retain Releaseindicateur dans les paramètres de construction sur OUI, comme l'a dit Lean. J'espère que cette aide.

REALFREE
la source
1
Notez que si vous exécutez actuellement l'installation du pod / la mise à jour du pod, les références faibles dans la version de conservation manuelle sont définies sur NON pour chaque cible de pod - et vous devrez à nouveau modifier les paramètres de construction.
Damo
20

La meilleure façon de résoudre ce problème est d'ajouter un post_installscript à votre fichier Podfile qui définit l' Weak References in Manual Retain Releaseindicateur sur yestoutes vos cibles de pod. Pour ce faire, collez simplement le code suivant au bas de votre fichier 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

Parfois, cela entraîne une erreur -fobjc-weak is not supported on the current deployment target. Vous pouvez résoudre ce problème en ajoutant une autre option de configuration, forçant tous les pods à cibler la version souhaitée (en fonction de cette réponse ):

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
villy393
la source
Bonne idée! Cela fonctionne pour moi, car j'utilise des Cocoapods. Merci.
mginius
3
J'ai eu une erreur suivante: -fobjc-faible n'est pas pris en charge sur la cible de déploiement actuelle
g212gs
J'ai également eu l'erreur -fobjc-faible, mais j'ai réussi à la corriger en définissant la cible de déploiement de tous les pods sur 8.3 (cible de déploiement de mon projet). Vous pouvez le faire avec un script, comme suggéré dans le deuxième script ci-dessus.
Xys
8

Solution de contournement pour les références faibles de Facebook dans FBSettings.m

Pour Podfile, il est possible d'écrire un script à exécuter après l'installation / la mise à jour du pod, décrit ce qui suit.

 
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 comment trouver les mots de la magie ça. XHTML valide.

Manobala
la source
1
Juste une note: On dirait que FB a changé la ligne incriminée dans la v3.24.4, pour la ligne de version 3.x. (Je ne suis pas sûr de la série 4.x, mais il ne semble pas qu'elle soit là maintenant.)
big_m
7

J'ai trouvé ça.

Je suppose que cela signifie supprimer __weak

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

Euh, y at-il jamais eu une telle chose comme une référence de variable faible sous MRR [manual retention-release]? «__weak» signifie une ou les deux choses suivantes:

  1. Une référence sans propriétaire (c'est-à-dire ne représentant pas un compte de rétention)

  2. Une référence de remise à zéro (c'est-à-dire que le runtime est remis à zéro lorsque l'objet référencé est désalloué).

# 1 ne s'applique pas à MRR, car vous ne conservez tout simplement pas la variable de toute façon.

# 2 ne s'applique pas non plus à MRR, car le support d'exécution est dans GC et ARC [comptage automatique de références], que vous n'utilisez pas.

Il semble que le compilateur se plaint maintenant de ne pas pouvoir faire ce qu'il ne pourrait jamais faire. (Et dans le cas d'un délégué d'application, vous ne pourriez pas faire la différence au moment de l'exécution, car le délégué d'application n'est généralement jamais désalloué.)

manquer de
la source
1

Accédez simplement à votre cible dans l'onglet "Build Phases", recherchez les fichiers pod dans "Compile Sources", cliquez sur ces fichiers et ajoutez le drapeau du compilateur "-fobjc-arc"

peski
la source
0

Ou changez __weaken __unsafeunretained. Cela résoudra le problème de la tradition. Depuis MRC (avant xCode 4 -) __weak n'était pas dans iOS.


la source