2010-04-25 151 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 

雖然這個編譯好,但我並不真正瞭解它是如何工作的。我對這個語句的閱讀是,我創建了一個包含兩個元素(標題和日期)的內聯數組。這是如何編譯的?我通過一個NSArray *來代替NSString *。我從一些對C++的理解中知道一個數組實際上是指向第一個元素的指針。那麼這個內聯數組是我創建一個C數組而不是一個NSArray?

我希望能夠實現的是能夠將我的課程中其他地方使用的靜態NSArray *傳遞給otherButtonTitles參數。但直接傳遞NSArray *對象不起作用。

回答

4

沒有涉及NSArray,您引用的方法簽名不完整。實際簽名是

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

, ...表示variadic function (varargs),這意味着任意的許多參數可能otherButtonTitles後提供。

這是一個C功能。被調用的函數可以使用stdarg.h中的方法接收參數。由於ObjC是C的超集,所以ObjC方法也支持可變參數,如圖所示使用, ...

例如,可變參數也用於+[NSArray arrayWithObjects:]+[NSString stringWithFormat:](這可能是您的混淆,通過「數組」)。


如果您有NSArray,可以在使用-addButtonWithTitle:創建操作表之後插入按鈕。

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

謝謝!不幸的是,它看起來像XCode的代碼完成沒有指出var args參數 - 這是我從中複製它的地方。我以前在Java中遇到過這個概念,所以這一切都合情合理! – mmccomb 2010-04-25 14:09:25

1

這與數組無關。您正在使用可變參數的基本ANSI C函數。查看va_list,va_startva_arg