86 votes

Xcode 7.3 ne peut pas créer de référence __weak dans un fichier à l'aide du comptage manuel des références

Après la mise à jour de Xcode 7.3, il me renvoie l’erreur Cannot create __weak reference in file using manual reference counting dans les fichiers pod. Est-ce que quelqu'un a résolu ce problème?

177voto

Lean Points 1094

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

Exemple visuel

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

21voto

REALFREE Points 1095

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

Ce problème se comporte comme prévu basé sur les éléments suivants: Nous sommes dans le processus de mise en œuvre de la faiblesse des références dans tous Objective-C langue les modes de transport. Depuis "__faibles" a toujours été ignorée par les non-ARC (et non-GC) les modes de langage, nous avons ajouté cette erreur à signaler les lieux où la sémantique qui va changer dans l'avenir. Veuillez mettre à jour votre bug rapport à laissez-nous savoir si c'est toujours un problème pour vous.

Donc, fondamentalement, si vous utilisez le Pod pour la 3ème partie, les bibliothèques, vous devez soit supprimer __faibles dans la non-ARC ou attendre la mise à jour.

Mise à jour @ 3/23

Je devrais avoir de la recherche sur les drapeaux que je peux passer pour complier, afin de contourner ces un peu fourre. Mais, fondamentalement, vous ne devez pas utiliser __weak chez les non-ARC de mode à partir de maintenant pour éviter les conflits inattendues. Pour cocoapods utilisateurs, vous n'avez pas besoin de supprimer __weak ou attendre la mise à jour, mais ensemble Weak References in Manual Retain Release drapeau dans les paramètres de construction de OUI comme le Lean a dit. Espérons que cette aide.

21voto

villy393 Points 1512

La meilleure façon de résoudre ce problème est d'ajouter un post_install script à votre Podfile qui définit l' Weak References in Manual Retain Release le drapeau en yes dans tous vos pod cibles. 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, faire que provoquer l'erreur -fobjc-weak is not supported on the current deployment target. Vous pouvez résoudre que par l'ajout d'une autre option de configuration, forçant tous les gousses de cibler la version que vous voulez (basé sur 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

8voto

Manobala Points 140

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 / mise à jour du pod, décrit les éléments suivants.

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

7voto

lack Points 111

J'ai trouvé cette.

Je suppose que c'est censé supprimer __faibles

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

Erm, a-t-il une telle chose comme une faiblesse de la variable de référence en vertu de MRR [manuel de conserver libération]? "__faibles" signifie un ou deux de deux choses l'une:

  1. Un propriétaire de référence (c'est à dire qui ne représentent pas un retain count).

  2. Une mise à zéro de référence (c'est à dire que le moteur d'exécution zéro lorsque l'objet référencé est libéré).

#1 ne s'applique pas à ce taux, parce que vous venez de ne pas retenir la variable de toute façon.

#2 ne s'applique pas à ce taux, car le support d'exécution est en GC et de l'ARC [automatique de comptage de référence], que vous ne l'utilisez pas.

Il semble que le compilateur est maintenant tout simplement se plaindre 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, depuis l'application délégué général n'est jamais libéré.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X