2012-01-10 9 views
8

Al intentar migrar mi código actual a ARC, recibo errores cada vez que paso un NSString como argumento NSInvocation.NSInvocación y ARC (recuento automático de referencias)

Ejemplo:

NSInvocation inv = ...; 
NSString *one = @"Hello World!"; 
[inv setArgument:&one atIndex:2]; 

El error se produce cuando se utiliza la Refactor -> Convertir en Objective-C ARC opción en el menú Editar. El texto es "SetArgument de NSInvocation no es seguro para ser utilizado con un objeto con propiedad que no sea __unsafe_retained".

¿Cómo puedo evitar esto?

Respuesta

10

Esto podría funcionar;

__unsafe_unretained NSString *one = @"Hello World"; 
+3

Esto funcionará, pero debe tener MUCHO cuidado con el manejo de la memoria al respecto. Yo recomendaría no usar NSInvocación más si puede evitarlo ... –

+1

Estoy usando OCMock, y pasa un objeto NSInvocation a sus bloques de devolución de llamada. Si no usa __unsafe_unretained en todos los parámetros, ARC se pone muy infeliz. Así que gracias por la sugerencia, ¡misteriosos accidentes se han ido! – phatmann

5

Como Joshua Weinberg comentó, el uso de NSInvocation ya no se recomienda. Si tiene hasta dos parámetros, puede usar performSelector. Para tres parámetros o más, puede usar -methodForSelector: de NSObject como se explica en here.

Cuestiones relacionadas