iOS自定义多参数类型方法

来源:互联网 发布:mac哪里设置环境变量 编辑:程序博客网 时间:2024/05/21 17:53

前几天做自定义UIAlertView的时候,想仿造系统自带的初始化方法做一个AlertView,里面涉及到不确定多参数的设置和使用问题。这里做一下记录。

我自定义了一个方法:

- (instancetype)initWithTitle:(NSString*)title message:(NSString*)message delegate:(id)delegate cancelButtonTitle:(NSString*)cancelButtonTitle otherButtonTitles:(NSString*)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION;

实现部分如下:

- (instancetype)initWithTitle:(NSString*)title message:(NSString*)message delegate:(id)delegate cancelButtonTitle:(NSString*)cancelButtonTitle otherButtonTitles:(NSString*)otherButtonTitles, ...{    self = [super initWithFrame:CGRectMake(0, 0, JK_SCREEN_WIDTH, JK_SCREEN_HEIGHT)];    if (self) {        self.delegate = delegate;        self.title = title;        self.message = message;        self.cancelButtonTitle = cancelButtonTitle;    }        if (otherButtonTitles) {        [self.otherButtonTitles addObject:otherButtonTitles];                va_list argList;  //定义一个 va_list 指针来访问参数表        va_start(argList, otherButtonTitles);  //初始化 va_list,让它指向第一个变参,otherButtonTitles 这里是第一个参数,虽然加了s,它不是数组。        id arg;        while ((arg = va_arg(argList, id))) //调用 va_arg 依次取出 参数,它会自带指向下一个参数        {            [self.otherButtonTitles addObject:arg];        }        va_end(argList); // 收尾,记得关闭关闭 va_list    }        return self;}

百度百科里的使用步骤是这样的。

(1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针;
(2)然后用VA_START宏初始化刚定义的VA_LIST变量;
(3)然后用VA_ARG返回可变的参数,VA_ARG的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用VA_ARG获取各个参数);
(4)最后用VA_END宏结束可变参数的获取。
注意

(1)可变参数的类型和个数完全由程序代码控制,它并不能智能地识别不同参数的个数和类型;
(2)如果我们不需要一一详解每个参数,只需要将可变列表拷贝至某个缓冲,可用vsprintf函数;
(3)因为编译器对可变参数的函数的原型检查不够严格,对编程查错不利.不利于我们写出高质量的代码;
百度词条地址:http://baike.baidu.com/view/1213054.htm

0 0
原创粉丝点击