6

Tengo una aplicación (solo ios5) que dentro de un método declara una variable débil utilizada dentro de un bloque para hacer referencia a una instancia de un controlador de vista.Objective-C ARC __weak referencia de variable desencadena advertencia "atributo __weak no se puede especificar en una variable automática"

QRCodeViewController * __weak weakSelf = self; 

El problema es que el compilador muestra un aviso que dice:

atributo __weak no se puede especificar en una variable automática

En esa aplicación que he utilizado una gran cantidad referencias débiles y nunca vi una advertencia como esa, la única diferencia con las otras clases es que esta clase se implementa en un archivo .mm ya que usa un objeto C++ y el proyecto no puede compilarse si lo dejo como .m.
Debo decir que el código parece funcionar bien.
¿Alguna sugerencia?

+0

¿No debería ser '__weak QRCodeViewController * = weakSelf auto;'? –

+2

@Martin cualquiera de los dos funciona, son equivalentes, su forma es la que veo que se usa con más frecuencia, pero el camino de Andrea es el recomendado por Apple. –

+0

Pregunta similar: http://stackoverflow.com/questions/10431110/nested-blocks-and-references-to-self. La respuesta fue que el objetivo de implementación se estableció en 4.0, pero ese no es el caso para usted. ¿Correcto? –

Respuesta

4

Frente a esta misma advertencia, hago desaparecer mediante un __block atribuir la siguiente manera:

__block __weak MyViewController* weakSelf = self; 
+0

¡¡Funciona !! – Andrea

0

No estoy seguro de por qué la advertencia dice que __weak no se puede especificar. AFAIK debería ser posible especificarlo, incluso si es muy peligroso usar __weak para variables automáticas.

La documentación de Apple dice que el compilador proporcionará una advertencia si lo hace, pero el texto de advertencia real parece implicar que el atributo va a ser ignorado no solo porque usarlo es peligroso, mientras que la documentación parece implicar que es peligroso pero funciona como se espera (si realmente entiendes qué esperar).

Tendrá que hacer algunos experimentos para verificar si el texto de advertencia es inapropiado o si la documentación no se ha actualizado correctamente.

+0

Hola, archivo analógico, gracias por tu respuesta, el hecho es que es normal crear referencias débiles para los objetos que deseas pasar a un bloque para evitar retener los ciclos. Hice toneladas de veces en mi código sin previo aviso. Estoy de acuerdo en que la debilidad de una variable automática es peligrosa, o mejor no tiene sentido, porque cuando se usa en un bloque para el proceso asincrónico, la variable se va porque no tiene una referencia fuerte. Pero aquí me estoy asignando una autoejecución que no es una variable automática y que está fuertemente referenciada por la existencia de la clase misma. – Andrea

+0

No es una tontería. Como dices, tiene casos de uso perfectamente razonables. Pero es peligroso. Su ejemplo de bloque asíncrono es perfecto (mucha gente tendría problemas para entender por qué no funciona). Ese es el razonamiento detrás de la elección de Apple para legalizarlo y, sin embargo, escupir una advertencia.Si ha verificado que funciona, creo que el problema está principalmente en el texto de advertencia, no en el hecho de que reciba la advertencia (que es una decisión consciente de los desarrolladores del compilador de acuerdo con los documentos). También es por eso que es solo una advertencia, incluso si está redactado como un error. –

+1

@AnalogFile: ¿Tiene alguna referencia a la documentación de Apple donde se dice que el compilador emite una advertencia si __weak se usa con variables automáticas? ¡Gracias! –

Cuestiones relacionadas