Objective C, раздающий … ноль, завершил списки аргументов

Наличие некоторых проблем с ... в 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 завершенный список?

20
задан Alex Wayne 26 February 2010 в 22:12
поделиться

2 ответа

Вы не можете этого сделать, по крайней мере, не так, как вы хотите. То, что вы хотите сделать (передать переменные аргументы), требует наличия инициализатора в 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]; \
}

Однако даже при использовании вариативного макроса вам все равно потребуется специальный макрос каждый раз, когда вы захотите это сделать. Это не очень надежная альтернатива.

40
ответ дан 29 November 2019 в 23:52
поделиться

Как насчет создания объекта NSInvocation ? Поскольку аргументы должны передаваться указателем, вы можете передать указатель на список с нулевым символом в конце.

Вы также можете перебирать параметры с помощью marg_list () и самостоятельно создавать список с нулевым завершением.

Это всего лишь простые предложения; Я их не пробовал.

0
ответ дан 29 November 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: