2010-04-25 6 views
0

Я только что написал фрагмент кода для отображения таблицы UIActionSheet в своем приложении. Пока я смотрел на код для инициализации моего UIActionSheet, что-то показалось мне немного странным. Функция инициализации имеет следующую подпись ...Передача указателя NSArray, а не указателя на конкретный тип

initWithTitle:(NSString *)title delegate:(id UIActionSheetDelegate)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle otherButtonTitles:(NSString *)otherButtonTitles 

Как вы можете увидеть параметр otherButtonTitles является указателем на строку. В моем коде я установил его следующим образом:

otherButtonTitles: @"Title", @"Date", nil 

Хотя это прекрасно компилируется, я действительно не понимаю, как это работает. Мое чтение утверждения состоит в том, что я создал встроенный массив, содержащий два элемента (Title и Date). Почему это происходит тогда? Я передаю NSArray * вместо NSString *. Из небольшого понимания C++ я знаю, что массив действительно является указателем на первый элемент. Итак, это встроенный массив, который я создаю массив C, а не NSArray?

Я надеюсь, что я смогу передать статический NSArray *, используемый в другом месте моего класса, в параметр otherButtonTitles. Но передача объекта NSArray * напрямую не работает.

ответ

4

В этом нет NSArray, и указанная вами подпись метода неполна. Фактическая подпись

… otherButtonTitles:(NSString *)otherButtonTitles, ...; 
//            ^^^^^ 

, ... указывает variadic function (varargs), что означает сколь угодно много аргументов могут быть поставлены после otherButtonTitles.

Это функция C. Вызываемая функция может принимать аргументы, используя методы в stdarg.h. Поскольку ObjC является надмножеством C, varargs поддерживается также для методов ObjC, используя , ..., как показано.

Например, varargs также используется в +[NSArray arrayWithObjects:] и +[NSString stringWithFormat:] (это может быть ваше замешательство в том, что передан «массив»).


Если у вас есть NSArray, вы можете вставить кнопки после того, как лист действий создается с помощью -addButtonWithTitle:.

for (NSString* title in array) 
    [actionSheet addButtonWithTitle:title]; 
+0

Спасибо! К сожалению, похоже, что завершение кода XCode не указывало аргумент var args - вот где я его скопировал. Я уже сталкивался с концепцией Java, поэтому все это имеет смысл! – mmccomb

1

Это не связано с массивами. Вы используете основные функции ANSI C для переменных аргументов. Посмотрите va_list, va_start и va_arg.

Смежные вопросы