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

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

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

Exemple visuel

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

Ceci est la réponse officielle d’Apple du lien:

Ce problème se comporte comme suit: Nous sums en train d’implémenter des références faibles dans tous les modes de langage Objective-C. Puisque «__weak» a été historiquement ignoré dans les modes de langage non-ARC (et non-GC), nous avons ajouté cette erreur pour indiquer les endroits où la sémantique changera dans le futur. Veuillez mettre à jour votre rapport de bogue pour nous faire savoir si cela rest un problème pour vous.

Donc, fondamentalement, si vous utilisez Pod pour des bibliothèques tierces, vous devez soit supprimer __weak dans 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 ces choses un peu. Mais fondamentalement, vous ne devriez pas utiliser __weak en mode non-ARC pour éviter tout conflit inattendu. Pour les utilisateurs de cocoapods, vous n’avez pas besoin de supprimer __weak ou d’attendre la mise à jour, mais de définir des Weak References in Manual Retain Release indicateur Weak References in Manual Retain Release dans les parameters de construction sur YES, comme dit Lean. J’espère que cette aide

La meilleure façon de résoudre ce problème consiste à append un script post_install à votre Podfile, qui définit l’indicateur de Weak References in Manual Retain Release rétention Weak References in Manual Retain Release sur yes dans toutes les cibles de votre pod. Pour ce faire, il vous 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, le résultat de 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, en 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 

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 qui. XHTML valide .

J’ai trouvé ça

Je suppose que cela signifiait supprimer __weak

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

Erm, y a-t-il déjà eu une référence variable faible dans le MRR? “__weak” signifie une ou les deux choses suivantes:

  1. Une référence inconnue (c’est-à-dire ne représentant pas un compte de rétention).

  2. Une référence de remise à zéro (c.-à-d. Que le runtime est mis à zéro lorsque l’object référencé est libéré).

# 1 ne s’applique pas à MRR, car vous ne conservez tout simplement pas la variable.

# 2 ne s’applique pas à MRR non plus, car la prise en charge de l’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 maintenant qu’il ne peut pas 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é.)

Allez dans votre cible dans l’onglet “Build Phases”, recherchez les fichiers pod dans “Comstack Sources”, cliquez sur ces fichiers et ajoutez le compilateur “-fobjc-arc”

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