Necesito crear en una aplicación iOS una falsificación va_list
para pasar a una función NSString initWithFormat:arguments:
, este es mi código:va_list falsa en ARC
NSArray *fixedArguments = [[NSArray alloc] initWithArray:arguments];
NSRange range = NSMakeRange(0, [fixedArguments count]);
va_list fakeArgList = (va_list)malloc(sizeof(NSString *) * [fixedArguments count]);
__unsafe_unretained id *ptr = (__unsafe_unretained id *)fakeArgList;
[fixedArguments getObjects:ptr range:range];
content = [[NSString alloc] initWithFormat:outputFormat
arguments:(va_list)fakeArgList];
free(fakeArgList);
El compilador se queja con este mensaje en la línea de reparto:
error: cast of a non-Objective-C pointer type 'va_list' (aka 'char *') to '__unsafe_unretained id *' is disallowed with ARC
La función getObjects:range:
se define como sigue:
- (void)getObjects:(id __unsafe_unretained [])objects range:(NSRange)range;
He intentado todo, pero todavía no puedo deshacerme de este error ...
¿Existe alguna solución para crear un falso va_list
con ARC habilitado? ¿Qué estoy haciendo mal?
Muchas gracias ... Estoy construyendo una vista selector que, dada una matriz plist contenidos de los diccionarios, un formato de impresión, digamos ' "(% @ - @%)% @"' , y una lista de teclas llena la vista del selector con la cadena formateada extrayendo los datos del archivo plist. La única forma en que encontré usar una impresión formateada con una lista variable de argumentos fue falsificar una va_list. Sé que está lejos de ser una programación limpia, pero no pude encontrar una solución mejor, cualquier alternativa válida es realmente bienvenida y creo que publicaré otra pregunta sobre mi problema para encontrar una solución más limpia. – Scakko
Si siempre está trabajando con% @ y nunca con otros parámetros de tamaño, puede buscar instancias de% @ en la cadena y reemplazarlas por [descripción del objeto] para cada uno de sus parámetros. Mismo efecto, no va_list falso. Pero eso no funcionará para el formateo numérico o cualquier otra cosa, a menos que quieras hacer un montón de trabajo extra. – ipmcc
Lo intentaré hoy, muchas gracias ... – Scakko