我刚刚编写了一段代码来在我的应用中显示UIActionSheet。在查看代码以初始化我的UIActionSheet时,有些事让我觉得有些奇怪。初始化函数具有以下签名......
initWithTitle:(NSString *)title delegate:(id UIActionSheetDelegate)delegate cancelButtonTitle:(NSString *)cancelButtonTitle destructiveButtonTitle:(NSString *)destructiveButtonTitle otherButtonTitles:(NSString *)otherButtonTitles
如您所见,otherButtonTitles参数是指向String的指针。在我的代码中,我将其设置如下......
otherButtonTitles: @"Title", @"Date", nil
虽然编译得很好但我真的不明白它是如何工作的。我读到的声明是我创建了一个包含两个元素(标题和日期)的内联数组。怎么会这样编译?我正在通过NSArray *代替NSString *。我从对C ++的一点了解中知道,数组实际上是指向第一个元素的指针。那么这个内联数组我是在创建一个C数组而不是NSArray吗?
我希望能够实现的是能够将我的类中其他地方使用的静态NSArray *传递给otherButtonTitles参数。但直接传递NSArray *对象不起作用。
答案 0 :(得分:4)
没有涉及NSArray,您引用的方法签名不完整。实际签名是
… otherButtonTitles:(NSString *)otherButtonTitles, ...;
// ^^^^^
, ...
表示variadic function (varargs),这意味着otherButtonTitles
之后可能会提供任意多个参数。
这是一个C功能。被调用的函数可以使用stdarg.h
中的方法接收参数。由于ObjC是C的超集,因此对于ObjC方法也支持varargs,如图所示使用, ...
。
例如,varargs也在+[NSArray arrayWithObjects:]
和+[NSString stringWithFormat:]
中使用(这可能是你传递“数组”的混淆)。
如果您有NSArray,可以在使用-addButtonWithTitle:
创建操作表后插入按钮。
for (NSString* title in array)
[actionSheet addButtonWithTitle:title];
答案 1 :(得分:1)
这与数组无关。您正在使用基本ANSI C函数作为变量参数。查看va_list
,va_start
和va_arg
。