Наличие некоторых проблем с ...
в ObjectiveC.
Я в основном обертываю метод и хочу принять a nil
завершенный список и непосредственно передает тот же самый список методу, который я обертываю.
Вот то, что я имею, но это вызывает EXC_BAD_ACCESS
катастрофический отказ. Осматривая локальный Вар, это появляется когда otherButtonTitles
просто a NSString
когда это передается в с otherButtonTitles:@"Foo", nil]
+ (void)showWithTitle:(NSString *)title
message:(NSString *)message
delegate:(id)delegate
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSString *)otherButtonTitles, ...
{
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:title
message:message
delegate:delegate
cancelButtonTitle:cancelButtonTitle
otherButtonTitles:otherButtonTitles] autorelease];
[alert show];
}
Как я просто перекачиваю от аргумента, поступающего к выходу аргумента, сохраняя то же самое nil
завершенный список?
Вы не можете этого сделать, по крайней мере, не так, как вы хотите. То, что вы хотите сделать (передать переменные аргументы), требует наличия инициализатора в UIAlertView
, который принимает va_list
. Нет ни одного. Однако вы можете использовать метод addButtonWithTitle:
:
+ (void)showWithTitle:(NSString *)title
message:(NSString *)message
delegate:(id)delegate
cancelButtonTitle:(NSString *)cancelButtonTitle
otherButtonTitles:(NSString *)otherButtonTitles, ...
{
UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:title
message:message
delegate:delegate
cancelButtonTitle:cancelButtonTitle
otherButtonTitles:nil] autorelease];
if (otherButtonTitles != nil) {
[alert addButtonWithTitle:otherButtonTitles];
va_list args;
va_start(args, otherButtonTitles);
NSString * title = nil;
while(title = va_arg(args,NSString*)) {
[alert addButtonWithTitle:title];
}
va_end(args);
}
[alert show];
}
Это, конечно, очень специфично для проблемы. Настоящий ответ таков: «вы не можете неявно передать список переменных аргументов методу / функции, у которой нет параметра va_list
». Следовательно, вы должны найти способ обойти проблему. В приведенном вами примере вы хотели создать alertView с переданными вами заголовками. К счастью для вас, в классе UIAlertView
есть метод, который вы можете итеративно вызывать для добавления кнопок и тем самым достичь того же общего эффект. Если бы у него не было этого метода, вам не повезло.
Другой действительно беспорядочный вариант - сделать это макросом с переменным числом аргументов. Вариативный макрос выглядит так:
#define SHOW_ALERT(title,msg,del,cancel,other,...) { \
UIAlertView *_alert = [[[UIAlertView alloc] initWithTitle:title message:msg delegate:del cancelButtonTitle:cancel otherButtonTitles:other, ##__VA_ARGS__] autorelease]; \
[_alert show]; \
}
Однако даже при использовании вариативного макроса вам все равно потребуется специальный макрос каждый раз, когда вы захотите это сделать. Это не очень надежная альтернатива.
Как насчет создания объекта NSInvocation
? Поскольку аргументы должны передаваться указателем, вы можете передать указатель на список с нулевым символом в конце.
Вы также можете перебирать параметры с помощью marg_list ()
и самостоятельно создавать список с нулевым завершением.
Это всего лишь простые предложения; Я их не пробовал.