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?
Définissez Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release
sur YES
.
Tiré de Forums des développeurs Apple - Xcode 7.3b4, sans arc, ne peut pas créer de référence __weak .
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.
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
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 ..
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:
Une référence non possédée (c'est-à-dire ne représentant pas un nombre de retenues).
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é.)
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"
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.