2012-03-17 9 views
28

Acabo de convertir un proyecto antiguo a ARC utilizando la refacturación automática de Xcode.Después de la conversión de Auto ARC: asignación de objetos retenidos a propiedades inseguras; objeto se lanzará después de la asignación

@property (nonatomic, retain) NSMutableArray *cards; 

fue reemplazado por:

@property (nonatomic) NSMutableArray *cards; 

Esto tiene sentido porque lo que he leído es que "fuerte" es el estado por defecto. Sin embargo, la siguiente línea es que me da el error en el título:

self.cards = [[NSMutableArray alloc] initWithCapacity:54]; 

se resuelve el error añadiendo strong de vuelta en donde retienen solía ser:

@property (nonatomic, strong) NSMutableArray *cards; 

Sin embargo ... si necesito para volver atrás y poner strong en cada declaración @property que fue retain ... ¿por qué la refactorización de ARC las eliminó todas?

+0

En realidad, la gestión de la memoria semántica por defecto es 'assign', no' strong', razón por la que está recibiendo el mensaje de advertencia. – jlehr

+5

jlehr no es correcto sobre la semántica de gestión de memoria predeterminada. pero tampoco está equivocado. antes de LLVM 3.1 y ARC, se ha asignado el valor predeterminado. pero hoy en día es fuerte. esto desafortunadamente está muy mal documentado. ver la respuesta de nschum. – stigi

+1

Ahora que el valor predeterminado es fuerte, la advertencia debería haber desaparecido. ¿Por qué no? –

Respuesta

42

Me he encontrado con la misma advertencia y he abierto un Incidente de soporte técnico. El ingeniero verificó que el valor predeterminado se cambió de "asignar" a "fuerte" por razones de coherencia dentro de ARC.

Dijo que tanto la advertencia como la documentación son erróneas y se solucionarán. Hasta que no se haga eso, quisiera evitar por completo el valor predeterminado!

Agregar explícitamente "fuerte" (como sugirió BJ Homer) es una forma segura de silenciar la advertencia y ser compatible. Pero no suponga que las propiedades no se retendrán por defecto. Siempre ponga "débil" o "asigne" allí también.

Editar: El clang documentation ahora documenta oficialmente este cambio. La advertencia ha sido fixed.

Edición 2: Xcode 4.4 aparentemente incluye la corrección.

+0

Entonces la advertencia ha sido arreglada. ¿Cuándo veremos esta solución en xcode? –

+1

@nschum esta advertencia aún ocurre en la última versión de Xcode 4.3.3. ¿por qué? –

+0

Desafortunadamente, la confirmación vinculada era al tronco * de LLVM. Entonces, no necesariamente esperaría que la solución se muestre en una versión de mantenimiento. No he probado Xcode 4.4. – nschum

8

Parece incorrecto que haya convertido nonatomic, retain en nonatomic. Siempre lo he visto convertir a nonatomic, strong. Si puede producir un proyecto simple que se convierta en la forma en que lo vio, sugiero filing a radar con él.

que asumen por la forma en que está utilizando la última versión de Xcode.

+0

Estoy utilizando 4.3.1 que descargué de la tienda de aplicaciones ayer, así que mejor sea el más nuevo. :) –

+2

Sí, esto es, desafortunadamente, un error conocido en 4.3.1. Lo reporté el otro día. La solución más fácil es simplemente hacer un proyecto regex replace de 'retain (, | \))' con 'strong \ 1'. Luego ejecute la conversión ARC nuevamente. –

+1

Archivar definitivamente un radar y luego @KennyWyland – mattjgalloway

Cuestiones relacionadas