2012-03-06 10 views
12

He utilizado la opción "Convertir a Objective C ARC" en Xcode 4.3 para convertir un proyecto iniciado en Xcode 4.0 para usar ARC. Luego de corregir los errores que encontró la herramienta, pasé por el proceso en el que la herramienta de migración eliminó todos los mensajes de lanzamiento y retuse los atributos en las declaraciones de mis propiedades. Así que ahora tengo todas mis propiedades con el atributo (no atómico). Al leer la documentación, todavía no tengo una respuesta clara sobre qué hacer.Cambio con propiedades y ivars después de la migración de ARC

Así que mi pregunta es: En caso de que omita la palabra clave sobre la semántica setter (fuerte, débil, retener, asignar) en la declaración de propiedad, ¿cuál es el atributo predeterminado en las propiedades cuando se usa ARC?

Encontré en la documentación que el atributo de propiedad predeterminado es asigne. Sin embargo, también dicen que ahora el atributo predeterminado para ivars, en caso de que lo omita, es strong.

Para explicar mejor mi pregunta, he aquí un ejemplo. Me encabezado del archivo tenemos la declaración:

@property (nonatomic) MyClass *objectToUse; 

y en nuestra aplicación sólo tenemos

@synthesize objectToUse; 

Si entonces escribimos dentro de algún método:

self.objectToUse = [[MyClass alloc] init]; 

tienen creamos un fuerte (retener) o débil (asignar) referencia? Si en cambio escribimos

objectToUse = [[MyClass alloc] init]; 

usando el ivar ¿hemos cambiado la situación con respecto a la política de retención de objetos? Me parece que ahora con ARC, la mejor práctica de usar las propiedades para la gestión de la memoria ya no es la misma práctica.

Respuesta

16

He abierto un Incidente de soporte técnico. El ingeniero verificó que el valor predeterminado se cambió de "asignar" a "fuerte". La razón es exactamente la incoherencia que describes. Ahora ivars y @properties tienen el mismo valor predeterminado.

Dijo que tanto la documentación (y las advertencias que algunas personas están recibiendo) están equivocadas y serán corregidas. (La herramienta de conversión es correcta). Hasta que no se haga eso, me gustaría evitar por completo el implícito predeterminado. Siempre especifique explícitamente "fuerte", "débil" o "asignar".

Editar: El clang documentation ahora documenta oficialmente este cambio.

7

El tipo de relación predeterminado sigue siendo assign, es decir, una referencia débil. Además, en modo ARC, el compilador generará un error cuando @synthesize ing accedores a menos que especifique explícitamente un tipo de relación.

La diferencia entre la asignación a self.objectToUse y objectToUse es que la segunda forma siempre utilizará ARC a retain o assign, mientras que la primera forma utilizará copy si ha especificado una relación copy.

+0

Dado que la migración de ARC eliminó el atributo 'retain' de sus declaraciones de propiedad, ¿es posible que el valor predeterminado haya cambiado a' strong' a partir de Xcode 4.3? No tengo una computadora para probarlo ahora, pero no me sorprendería. –

+0

Eso es realmente lo que me confunde, ya que ARC elimina todos los atributos 'retain' y deja todas las propiedades con 'assign' (por defecto), lo que significa que después de la migración ARC debe pasar por todas sus declaraciones de propiedades y agregar el atributo 'strong' para tener el mismo comportamiento. Es interesante que los delegados con el atributo 'assign' se cambien a' unsafe_unretained', lo cual está bien, pero ¿es posible que 'retain' no se cambie a' strong' automáticamente? – Luka

+0

Parece un error en el migrador para mí. Me parece recordar que mis proyectos 'retener' los atributos se convierten a' fuerte' en XCode 4.2 –

Cuestiones relacionadas