Estoy intentando construir una lista de argumentos de variable "falsa", utilizando la técnica descrita here, pero para el proyecto ARC habilitado y no puedo entender cómo obtener librarme del error que estoy recibiendoCómo convertir de char * a id * con ARC habilitado
Aquí está el código en cuestión:
NSMutableArray* argumentsArray = [NSMutableArray array];
// ... Here I fill argumentsArray with some elements
// And then, I want to construct a "fake" variable argument list
char* fakeArgList = (char*) malloc(sizeof(NSString*) * [argumentsArray count]);
[argumentsArray getObjects: (id*) fakeArgList];
NSString* content = [[NSString alloc] initWithFormat: formatString arguments:fakeArgList];
XCode se queja sobre la ( id) fakeArgList * fundición, diciendo:
moldeada de la no-Objective-C de tipo puntero char' * 'to' _autoreleasing id * ' no está permitido con ARC
Mi teoría inicial era th simplemente necesito agregar __unsafe_unretained a (id *) casting para decirle a ARC que soy responsable de ese bloque de memoria y no debería retenerlo/liberarlo, pero eso no funciona y no puedo entender cómo para arreglar este problema
Actualización: Aquí tiene la función completa. Debería tomar una cadena de formato de estilo printf y una lista de variables de nombres dentro de .plist y generar una cadena formateada con los datos cargados desde .plist. Es decir, si tengo un archivo plist con los campos "campo1" = "foo" y "campo2" = 3 y que llamo [loadStringFromFixture: @"?param1=%@¶m2=%d", @"field1", @field2]
entonces yo debería conseguir cadena "? Param1 = foo & param2 = 3"
- (NSString*) loadStringFromFixture:(NSString*) format, ...
{
NSString* path = [[NSBundle mainBundle] bundlePath];
NSString* finalPath = [path stringByAppendingPathComponent:@"MockAPI-Fixtures.plist"];
NSDictionary* plistData = [NSDictionary dictionaryWithContentsOfFile:finalPath];
va_list argumentsList;
va_start(argumentsList, format);
NSString* nextArgument;
NSMutableArray* argumentsArray = [NSMutableArray array];
while((nextArgument = va_arg(argumentsList, NSString*)))
{
[argumentsArray addObject: [plistData objectForKey:nextArgument]];
}
NSRange myRange = NSMakeRange(0, [argumentsArray count]);
id* fakeArgList = (__bridge id *)malloc(sizeof(NSString *) * [argumentsArray count]);
[argumentsArray getObjects:fakeArgList range:myRange];
NSString * content = [[NSString alloc] initWithFormat:formatString
arguments:(__bridge va_list)fakeArgList];
free(fakeArgList);
return content;
}
Tiene que haber una mejor manera de hacer esto ... – semisight
serio; Una lectura rápida del artículo fuente me hace pensar que solo funciona por coincidencia y está fuera de los límites de la ABI o especificación. – bbum
Eso es cierto, pero lo necesito solo para mi código de prueba de unidad, así que estoy menos preocupado por el hecho de que es un "truco sucio". Aunque si alguien puede señalar una mejor manera de construir una lista de argumentos variables, estoy realmente interesado. –