РЕДАКТИРОВАТЬ: Это больше не работает. Как и предполагалось в первоначальном ответе, ABI, по-видимому, изменился из-под этого ответа
Немного поигрался и заставил его работать - дважды проверил на утечки или оставленную память и ничего не увидел.
NSArray *fixedArguments = [[NSArray alloc] initWithObjects: @"foo", @"bar", @"baz", nil];
NSRange range = NSMakeRange(0, [fixedArguments count]);
NSMutableData* data = [NSMutableData dataWithLength: sizeof(id) * [fixedArguments count]];
[fixedArguments getObjects: (__unsafe_unretained id *)data.mutableBytes range:range];
NSString* content = [[NSString alloc] initWithFormat: @"1: %@ 2: %@ 3: %@" arguments: data.mutableBytes];
NSLog(@"%@", content);
Мне нравится (ab) использовать NSMutableData, как это, чтобы получить семантику сохранения / освобождения для произвольного куска памяти - это не обязательно относится к рассматриваемой проблеме, но это хитрый маленький трюк.
Как примечание для будущих читателей: фальсификация подобного va_list может работать с текущим ABI для MacOS и iOS, но в целом он не переносимый и не очень хороший подход.