Después de actualizar a Xcode 7.3, arroja el error Cannot create __weak reference in file using manual reference counting
en los archivos de pod. ¿Alguien ha resuelto este problema?
Respuestas:
Establecer Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Release
en YES
.
Tomado de los foros de desarrolladores de Apple: Xcode 7.3b4, sin arco, no puede crear una referencia débil .
Esta es la respuesta oficial de Apple desde el enlace:
Este problema se comporta según lo previsto en función de lo siguiente: Estamos en el proceso de implementar referencias débiles en todos los modos de lenguaje Objective-C. Dado que históricamente se ha ignorado "__weak" en los modos de lenguaje que no son ARC (ni GC), hemos agregado este error para señalar lugares donde la semántica cambiará en el futuro. Actualice su informe de errores para informarnos si esto sigue siendo un problema para usted.
Básicamente, si está utilizando Pod para bibliotecas de terceros, debe eliminar __weak en no ARC o esperar la actualización.
Actualización @ 3/23
Debería haber investigado más sobre las banderas que puedo pasar al cumplidor para evitar estas cosas. Pero fundamentalmente no debería utilizarlo __weak
en modo no ARC a partir de ahora para evitar conflictos inesperados. Para los usuarios de cocoapods, no es necesario que elimine __weak
o espere la actualización, sino que establezca la Weak References in Manual Retain Release
marca en la configuración de compilación en SÍ, como dijo Lean. Espero que esto ayude.
La mejor manera de resolver esto es agregar un post_install
script a su Podfile que establezca la Weak References in Manual Retain Release
bandera yes
en todos sus objetivos de pod. Para hacer eso, simplemente pegue el siguiente código en la parte inferior de su archivo 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
A veces, hacer eso da como resultado el error -fobjc-weak is not supported on the current deployment target
. Puede resolver eso agregando otra opción de configuración, obligando a todos los pods a apuntar a la versión que desea ( según esta respuesta ):
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
Solución alternativa para referencias débiles de Facebook en FBSettings.m
Para Podfile, es posible escribir un script para que se ejecute después de la instalación / actualización del pod, describe lo siguiente allí.
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 cómo encontrar las palabras de la magia que. .
He encontrado esto.
Supongo que significa eliminar __weak
https://forums.developer.apple.com/thread/38934
Erm, ¿existió alguna vez una referencia de variable débil en MRR [liberación de retención manual]? "__weak" significa una o las dos cosas:
Una referencia sin propietario (es decir, que no representa un recuento de retención).
Una referencia de puesta a cero (es decir, que el tiempo de ejecución se pone a cero cuando el objeto referenciado se desasigna).
# 1 no se aplica a MRR, porque simplemente no retienes la variable de todos modos.
El n. ° 2 tampoco se aplica a MRR, porque el soporte de tiempo de ejecución está en GC y ARC [recuento de referencia automático], que no está utilizando.
Parece que el compilador ahora se queja de que no puede hacer lo que nunca podría hacer. (Y en el caso de un delegado de aplicación, no podría notar la diferencia en tiempo de ejecución, ya que el delegado de aplicación generalmente nunca se desasigna).
O cambie __weak
a __unsafeunretained
. Esto resolverá el problema en la tradición. Dado que MRC (antes de xCode 4 -) __weak no estaba en iOS.
-Wall -Wextra -Wno-unused-parameter
banderas de advertencia habilitadas.