Xcode 7.3 no puede crear una referencia débil en el archivo usando el recuento de referencias manual

86

Después de actualizar a Xcode 7.3, arroja el error Cannot create __weak reference in file using manual reference countingen los archivos de pod. ¿Alguien ha resuelto este problema?

REALFREE
fuente

Respuestas:

176

Establecer Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Releaseen YES.

Ejemplo visual

Tomado de los foros de desarrolladores de Apple: Xcode 7.3b4, sin arco, no puede crear una referencia débil .

Ryan
fuente
7
Esto todavía no me funciona :( ¿podría haber otra marca del compilador que anule esta configuración que podría haber habilitado? Tengo estas -Wall -Wextra -Wno-unused-parameterbanderas de advertencia habilitadas.
Kdawgwilk
6
@Kdawgwilk ¿Estás seguro de que enciendes esa bandera correctamente? Si está en su proyecto, simplemente puede eliminar la palabra clave __weak aunque. No lo intenté, pero también puedes intentar activar la bandera en el proyecto Pod si estás usando Pod
REALFREE
3
Tenga en cuenta que si actualmente ejecuta la instalación / actualización del pod, las Referencias débiles en la versión de retención manual se establecen en NO para cada objetivo del pod, y tendrá que editar la configuración de compilación nuevamente.
Damo
2
También tuve que hacer esto en la configuración del proyecto de pod.
Bernard
impresionante respuesta chicos.
Bartłomiej Semańczyk
21

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 __weaken modo no ARC a partir de ahora para evitar conflictos inesperados. Para los usuarios de cocoapods, no es necesario que elimine __weako espere la actualización, sino que establezca la Weak References in Manual Retain Releasemarca en la configuración de compilación en SÍ, como dijo Lean. Espero que esto ayude.

REALFREE
fuente
1
Tenga en cuenta que si actualmente ejecuta la instalación / actualización del pod, las Referencias débiles en la versión de retención manual se establecen en NO para cada objetivo del pod, y tendrá que editar la configuración de compilación nuevamente.
Damo
20

La mejor manera de resolver esto es agregar un post_installscript a su Podfile que establezca la Weak References in Manual Retain Releasebandera yesen 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
villy393
fuente
¡Gran idea! Me está funcionando porque estoy usando Cocoapods. Gracias.
mginius
3
Recibí el siguiente error: -fobjc-débil no es compatible con el objetivo de implementación actual
g212gs
También obtuve el error -fobjc-débil, pero logré solucionarlo estableciendo el objetivo de implementación de todos los pods en 8.3 (el objetivo de implementación de mi proyecto). Sin embargo, puede hacerlo con un script, como se sugiere en el segundo script anterior.
Xys
8

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. XHTML válido.

Manobala
fuente
1
Solo una nota: parece que FB ha cambiado la línea ofensiva en v3.24.4, por la línea de lanzamiento 3.x. (No estoy seguro acerca de la serie 4.x, pero no parece que esté allí ahora.)
big_m
7

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:

  1. Una referencia sin propietario (es decir, que no representa un recuento de retención).

  2. 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).

carencia
fuente
1

Simplemente vaya a su objetivo en la pestaña "Fases de compilación", busque los archivos de pod en "Compilar fuentes", haga clic en esos archivos y agregue la marca del compilador "-fobjc-arc"

peski
fuente
0

O cambie __weaka __unsafeunretained. Esto resolverá el problema en la tradición. Dado que MRC (antes de xCode 4 -) __weak no estaba en iOS.


fuente