小说网站 搜小说 无限网 烟雨红尘 小说爱好者 免费小说 免费小说网站

iOS自定义多参数类型方法

前几天做自定义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

posted on 2015-04-01 10:03  王小航  阅读(1908)  评论(0编辑  收藏  举报

导航