Как преобразовать из char * в id * с включенным ARC

Я пытаюсь создать список «поддельных» переменных аргументов, используя технику, описанную здесь , но для проекта с поддержкой 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;
}

8
задан Alex Koloskov 31 October 2011 в 19:56
поделиться