web-dev-qa-db-fra.com

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

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

79
REALFREE

Définissez Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release sur YES

Visual example

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

170
Ryan

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

Ce problème se comporte comme prévu en fonction des éléments suivants: Nous sommes dans le fichier processus de mise en œuvre de références faibles dans tout le langage Objective-C modes. Puisque «__weak» a été historiquement ignoré dans les modes de langage non ARC (et Non GC), nous avons ajouté cette erreur pour indiquer des lieux où la sémantique va changer dans le futur. Veuillez mettre à jour votre bogue signaler pour nous faire savoir si cela est toujours un problème pour vous.

En résumé, si vous utilisez Pod pour des bibliothèques tierces, vous devez supprimer __weak dans une version non-ARC ou attendre la mise à jour. 

Mise à jour @ 3/23

J'aurais dû faire plus de recherches sur les drapeaux que je pourrais passer à complier afin de contourner ce genre de choses. Mais fondamentalement, vous ne devriez pas utiliser __weak en mode non-ARC à partir de maintenant pour éviter tout conflit inattendu. Pour les utilisateurs de cocoapodes, vous n'avez pas besoin de supprimer __weak ni d'attendre la mise à jour, mais de définir l'indicateur Weak References in Manual Retain Release dans les paramètres de construction sur YES, comme indiqué par Lean. J'espère que cette aide. 

20
REALFREE

Le meilleur moyen de résoudre ce problème consiste à ajouter un script post_install à votre fichier podfile qui définit l'indicateur Weak References in Manual Retain Release sur yes dans toutes les cibles de votre pod. Pour ce faire, il suffit de coller le code suivant au bas de votre 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 l'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
20
villy393

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.


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 que .Valid XHTML.

8
Manobala

J'ai trouvé ça.

Je suppose que cela signifiait supprimer __ faible 

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

Euh, y a-t-il jamais eu une référence de variable faible sous MRR [main-conservation manuelle]? "__weak" signifie une ou deux choses:

  1. Une référence non possédée (c'est-à-dire ne représentant pas un nombre de retenues).

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

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

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

On dirait que le compilateur se plaint simplement 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 seriez pas en mesure de 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é.)

7
lack

Allez simplement sur votre cible dans l’onglet "Build Phases", recherchez les fichiers pod dans "Compiler les sources", cliquez sur ces fichiers et ajoutez le drapeau du compilateur "-fobjc-arc"

1
peski

Ou remplacez __weak par __unsafeunretained. Cela résoudra le problème dans la tradition. Depuis MRC (avant xCode 4 -), __weak n’était pas dans iOS.

0
user3693546