将NSArray指针而不是指针传递给特定类型

时间:2010-04-25 13:54:36

标签: iphone objective-c

我刚刚编写了一段代码来在我的应用中显示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 *对象不起作用。

2 个答案:

答案 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_listva_startva_arg