zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [Swift]LeetCode843. 猜猜这个单词 | Guess the Word
    [Swift]LeetCode852. 山脉数组的峰顶索引 | Peak Index in a Mountain Array
    [Swift]LeetCode867. 转置矩阵 | Transpose Matrix
    [Swift]LeetCode859. 亲密字符串 | Buddy Strings
    [Swift]LeetCode844. 比较含退格的字符串 | Backspace String Compare
    [Swift]LeetCode824. 山羊拉丁文 | Goat Latin
    PHP 分析1
    php 分析
    停下库
    常用sql
  • 原文地址:https://www.cnblogs.com/wanghang/p/6298878.html
Copyright © 2011-2022 走看看