На самом деле нетрудно создать va_list из NSArray. См. Превосходную статью Мэтта Галлахера на эту тему.
Вот категория NSString, чтобы делать то, что вы хотите:
@interface NSString (NSArrayFormatExtension)
+ (id)stringWithFormat:(NSString *)format array:(NSArray*) arguments;
@end
@implementation NSString (NSArrayFormatExtension)
+ (id)stringWithFormat:(NSString *)format array:(NSArray*) arguments
{
char *argList = (char *)malloc(sizeof(NSString *) * arguments.count);
[arguments getObjects:(id *)argList];
NSString* result = [[[NSString alloc] initWithFormat:format arguments:argList] autorelease];
free(argList);
return result;
}
@end
Затем:
NSString* s = [NSString stringWithFormat:@"xxx=%@, yyy=%@" array:@[@"XXX", @"YYY"]];
NSLog( @"%@", s );
К сожалению, для 64-битного формат va_list изменился, поэтому код больше не работает. И, вероятно, не следует использовать в любом случае, поскольку это зависит от формата, который может быть изменен. Поскольку не существует действительно надежного способа создания va_list, лучшим решением будет просто ограничить число аргументов до разумного максимума (скажем, 10), а затем вызвать stringWithFormat с первыми 10 аргументами, что-то вроде этого: ]
Допустим, вы пишете базовую процедуру сериализации, которая будет сериализовать любой объект в XML. Как бы вы сделали его достаточно универсальным, чтобы он мог работать с любым объектом? Если у вас есть класс, в котором вы знаете все свойства, вы можете легко написать функцию «ToXml ()», в которой вы вручную записываете все свойства в XML. Что, если вы хотите распространить это на ЛЮБОЙ объект? В этом случае вам нужно обдумать свойства во время выполнения и записать их в XML.
Есть много других применений для этого, это первое, что пришло в голову.
Есть много применений для отражения. .NET Framework использует его для сериализации и для привязки данных , его также можно использовать для создания инструментов, которые исследуют ваш код, таких как Reflector, FxCop и NUnit, а также каркасы баз данных ORM. Он имеет множество применений во время выполнения: от регистрации конкретных вещей об объекте до Структур внедрения зависимостей . Его также можно использовать для динамического выполнения методов или установки свойств во время выполнения, как это делается с настраиваемыми атрибутами. Его также можно использовать в программировании более высокого уровня, таком как метапрограммирование и самомодифицирующийся код.
Я думаю, что статья Википедии об отражении очень хороша:
В информатике отражение - это процесс, с помощью которого компьютерная программа может наблюдать и изменять свои собственные структура и поведение. В парадигма программирования, основанная на отражение называется отражающим программирование. Это особый вид метапрограммирования.
Во многих компьютерных архитектурах, программные инструкции хранятся как данные - отсюда и различие между инструкция и данные - это просто независимо от того, как информация лечится компьютером и язык программирования. Как обычно, "инструкции" "выполняются" и «данные» «обрабатываются»; однако в некоторые языки, программы также могут рассматривать инструкции как данные и поэтому сделайте рефлексивным модификации. Отражение наиболее обычно используется в высокоуровневых виртуальных языки машинного программирования, такие как Smalltalk и языки сценариев, а также реже используется в явно типизированных и / или статически типизированное программирование языки, такие как Java и C.
Reflection позволяет вам получать информацию о типе объекта во время выполнения. Это может быть полезно во многих ситуациях, включая (но ограничиваясь ими) сериализацию и объектно-реляционные сопоставления.
Также может быть очень полезной при тестировании вашего приложения, например, модульных тестов или других типов тестовых сред. Используя отражение, вы можете, например, создать XML-файл (или какой-либо другой файл входных данных в подходящем формате) и попросить вашу программу проанализировать его и вызвать методы, определенные в файле. Так работает Фитнес .
Он используется для метапрограммирования, то есть когда вы кодируете код, а не обычные бизнес-задачи
Отражение используется, когда во время компиляции вы не знаете, в какое время находится ваш объект, какое действие делать или с каким свойством ...
Вы можете использовать отражение, чтобы найти все объекты типа X в данной сборке , или вызвать какой-либо метод по его имени (полученный из базы данных или файла конфигурации ...), то же самое для установки свойства .... такие вещи (это тот случай, когда мы его использовали)