2012-09-17 20 views
7

Tengo un proyecto específico Xcode 3.2. Quiero convertir este proyecto a ARC para mejorar el rendimientoconversión de un proyecto que no es ARC a ARC

.Estoy siguiendo estos pasos.

Editar-> Refactor-> Convertir en Objective C ARC

Tengo algunos archivos .MM a la que estoy usando la desactivación de la ARC--fno objc-arco. Pero incluso después de

esto estoy recibiendo muchos errores (problemas de ARC). Por ejemplo, principalmente en la llamada self = [super init], el error

no se puede asignar a self fuera de un método en la familia init. ¿Puede

si alguien me dice ¿sigo los pasos correctos?

Respuesta

15

yo estaba tratando de convertir un projet de ARC y después de la creación de uno nuevo y que incluye los archivos de la anterior - una de las cuestiones que obtuve fue

No se puede asignar a 'auto' fuera de una método en la familia init

el nombre selector debe comenzar con init - no sólo que - en mi caso el selector de inicio fue:

-(id)initwithPage:(unsigned)pageNum {...} 

Observe la pequeña 'w'.

me han cambiado a:

-(id)initWithPage:(unsigned)pageNum {...} 

Aviso la capital 'W'!

Mi problema fue resuelto.

Espero que esto ayude a alguien.

+1

Incluso lo he observado en mi XCode también. – Raj

+1

Una nota adicional: esto se menciona (aunque muy sutilmente) en la documentación de LLVM: "Un selector está en cierta familia de selectores si, ignorando cualquier guión bajo inicial, el primer componente del selector consiste completamente en el nombre del método familia o comienza con ese nombre seguido de un carácter ** que no sea una letra minúscula. ** " – Xono

+0

y no se olvide de - (id) el valor de retorno! – JeanNicolas

1
tutoriales de

Ray Wenderlich tienen una buena ARC-conversión-tutorial de dos partes, que debe detallar los pasos correctos a tomar: Part 1Part 2

En términos del error que está teniendo, la descripción más o menos resume todo : está asignando a self en un método que no cumple con the standard for init methods. No puedo decir si eso es legal antes del ARC, pero ciertamente ya no lo es. Para resolverlo, hazlo un método init (sigue la práctica init de llamar a un método super init en sí mismo, inicializando cualquier valor y regresando a uno mismo), o elimina la asignación dentro de él. Para otros errores, publique cualquier tema con el que tenga problemas (muchos de ellos están incluidos en los tutoriales de Ray) y haremos lo que podamos.

+1

Es totalmente legal, pero la pregunta es: ¿en qué escenario le gustaría asignar 'self' fuera de un método' init'? – nielsbot

+1

Es totalmente posible que sus métodos tengan un comportamiento de estilo init, pero simplemente no devuelven el objeto iniciado (es decir, llamar 'obj = [Obj alloc];' '[obj initWithData];' con initWithData que devuelve vacío). Como los métodos init deben devolver un puntero, funcionaría bien antes de ARC, pero causaría problemas masivos cuando se convierta. Afortunadamente, si eso es todo, solo debería ser una cuestión de actualizar las declaraciones. – Xono

Cuestiones relacionadas