Я пытаюсь создать список «поддельных» переменных аргументов, используя технику, описанную здесь , но для проекта с поддержкой ARC, и я не могу понять, как получить избавиться от ошибки, которую я получаю.
Вот код, о котором идет речь:
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 жалуется на приведение (id ) fakeArgList *, говоря:
Приведение не-Objective-C типа указателя 'char *' к '_autoreleasing id * ' запрещено в ARC
Моя первоначальная теория заключалась в том, что мне просто нужно добавить __unsafe_unrehibited к (id *) преобразованию, чтобы сообщить ARC, что я отвечаю за этот блок памяти, и он не должен сохранить / отпустить его, но это не работает, и я не могу понять, как решить эту проблему.
Обновление: Вот полная функция. Он должен принимать строку формата в стиле printf и список переменных с именами полей внутри .plist и выводить отформатированную строку с данными, загруженными из .plist. Т.е., если у меня есть файл .plist с полями "field1" = "foo" и "field2" = 3, и я вызываю [loadStringFromFixture: @ "? Param1 =% @ & param2 =% d", @ "field1" , @ field2]
тогда я должен получить строку "? 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;
}